flask template form
Този урок обяснява какво представляват шаблон, форма, изглед, отговор и пренасочване с практически примери:
Като цяло, Шаблонирането се използва в Програмирането, за да се използва повторно част от текст с различни данни. Що се отнася до уеб разработката, дизайнерите използват шаблони за показване на данни във форма, която е четлива и привлекателна за читателите.
Дизайнът на шаблон обикновено включва използването на език поради сложността, породена от човешкото взаимодействие.
=> Погледнете тук ръководството за начинаещи колби
Какво ще научите:
Въведение
Flask използва механизъм за шаблониране, наречен Jinja2, който показва поведението на приложението въз основа на нивото на взаимодействие на потребителя. Шаблонът на Jinja използва променливи, изрази и тагове.
Променливите и изразите се заменят със стойности по време на изпълнение преди изобразяването на страницата в браузъра. Таговете на Jinja помагат при писането на логика и контролират изявления в шаблона Flask.
Изглед на колба
Идеята за Flask view се извежда от преобладаващия модел за проектиране на уеб приложения, наречен Model-View-Controller. Изгледът е един от трите взаимосвързани елемента в тази парадигма, където се занимава с логиката на приложението. Изгледът се грижи за представянето на информация на Потребителя.
В предишния ни урок ние проектирахме View, като подкласирахме класа BaseView на Flask-Appbuilder. В следващата част на този урок ще разширим последния си пример и ще представим начините, по които изгледите могат да бъдат персонализирани.
Шаблон за колба
Нека започнем и напишем първия си шаблон. Създайте файл, наречен hello.html под директорията на шаблони.
Напишете следния код в този файл и го запазете.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %}
Шаблон за цикъл
В горния шаблон на Flask използвахме цикъл for, за да итерираме елементите от списъка. В нашия контролер или манипулатор предадохме списък със стойности на поздравления към шаблона. Вътре в шаблона имаме достъп до всеки елемент, използвайки синтаксиса {{item}}.
Шаблон, ако блок
Освен това направете бележка за използването на изявление if. Тук тестваме елемента за Сутрин и го правим смел и курсив.
Сега нека да пристъпим напред, за да научим повече за концепциите на Flask Forms.
Форми за колби
Един от най-важните аспекти на шаблонирането е да се вземат входове от потребителите и да се пише бекенд логика въз основа на този вход. Нека създадем формуляр.
Използваме Flask-Appbuilder SimpleFormView, за да изобразим формата си. Нека първо да създадем формуляр. В допълнение към създаването на формуляр, трябва да използваме командата fab create-admin команда, за да създадем потребител на администратор.
Затова използвайте командата преди стартиране на сървъра за разработка, така че създадените впоследствие изгледи и формуляри да могат да бъдат валидирани с влязъл потребител. Влизаме с потребителя на администратор и продължаваме да потвърждаваме, че създадените изгледи са видими в менюто, както е показано на екранните снимки.
Създайте администратор
Използвайте командата по-долу, за да създадете потребител на администратор.
колба fab create-admin
Влезте с администраторските идентификационни данни
- Щракнете върху Вход, след като отворите http: // localhost: 8080.
- Влезте с идентификационните данни на администратора, създадени в предишния раздел.
- Кликнете върху категорията Моите формуляри, за да получите достъп до вашите изгледи.
Забележка: Ще можете да изпълните последната стъпка само след добавяне на изгледите към менюто по подразбиране, показано в лентата за навигация.
Нека да продължим и да създадем възгледи, базирани на формуляри.
Създайте файл, наречен forms.py в директорията на приложението, и напишете следния код в него.
from wtforms import Form, StringField from wtforms.validators import DataRequired from flask_appbuilder.fieldwidgets import BS3TextFieldWidget from flask_appbuilder.forms import DynamicForm class GreetingsForm(DynamicForm): greeting1 = StringField(('Morning'), description = ('Your morning Greeting'), validators = [DataRequired()], widget = BS3TextFieldWidget()) greeting2 = StringField(('Afternoon'), description = ('Your Afternoon Greeting'), validators = [DataRequired()], widget = BS3TextFieldWidget()) greeting3 = StringField(('Evening'), description = ('Your Evening Greeting'), widget = BS3TextFieldWidget()) greeting4 = StringField(('Night'), description = ('Your Night Greeting'), widget = BS3TextFieldWidget())
Създадохме формуляр, базиран на DynamicForm от Flask-Appbuilder. Има четири текстови полета. Ние разширяваме нашия пример с поздрави. От четирите полета две са задължителни и две не са задължителни, тъй като за първите два поздрава споменахме стойностите за валидатори.
Сега нека създадем изглед за този формуляр. Напишете следните редове код във файла views.py.
from flask import render_template, flash from flask_appbuilder import SimpleFormView from app.forms import GreetingsForm class GreetingsView(SimpleFormView): form = GreetingsForm form_title = 'This is a Greetings form' message = 'Your Greetings are submitted' def form_get(self, form): form.greeting1.data = 'Your Morning Greeting' form.greeting2.data = 'Your Afternoon Greeting' form.greeting3.data = 'Your Evening Greeting' form.greeting4.data = 'Your Night Greeting' def form_post(self, form): flash(self.message, 'info') greetings = [ form.greeting1.data, form.greeting2.data, form.greeting3.data, form.greeting4.data, ] session['greetings']=greetings return redirect(url_for('HelloWorld.hello_greetings2'))
В нашия поглед по-горе имаме два метода, наречени form_get и form_post за попълване на стойностите по подразбиране в полетата на формулярите и четене на въведените стойности, след като формулярът е изпратен, съответно от браузъра.
GreetingsView показва формата, както е показано на изображението по-долу.
Също така използваме обект на сесия Flask, за да съхраняваме стойностите на полетата във form_post, за да можем да получим достъп до същите в съответния нов изглед, който предстои да напишем.
Нека сега модифицираме класа HelloWorld и добавим друг метод за показване на поздравите. Ще го наречем hello_greetings2.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session['greetings'] return render_template('hello.html', greetings=greetings)
В този изглед четем стойностите от обекта на сесията и използваме шаблона за рендиране на Flask, за да покажем тези стойности в HTML, обърнат към потребителя. Забележете, че hello_greetings2 е алтернативен начин за постигане на същата функционалност, подобна на hello_greetings.
Единствената разлика е, че използвайки hello_greetings2, ние показваме стойностите, въведени от потребителя, а в hello_greetings не взехме никакви входове от потребителя и ги кодирахме твърдо, докато записвахме изгледа, съотнесен към съответния маршрут.
Отговор на колбата
Доста рядко се среща изричното използване на Flask response в кода. Класът на отговора в Flask е само подклас на класа на отговора от класа на Werkzueg’s Response, който от своя страна подкласира своя клас ResponseBase.
Обектът Flask Response се формира вътрешно от Flask, когато извикаме оператор за връщане или метод като render_template.
Освен това можем да персонализираме кода за отговор и типа съдържание, ако е необходимо като част от оператора за връщане в нашите изгледи, както е показано в модифицирания изглед HelloWorld по-долу.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session['greetings'] return render_template('hello.json', greetings=greetings), 201, {'Content-Type' : 'application/json'
Директното използване на класа на Flask’s Response може да бъде обхванато в случай на употреба, когато предаваме поточно съдържанието, вместо да връщаме цялото съдържание наведнъж поради ограниченията на размера на файла и честотната лента на мрежата.
По-долу сме показали един пример за поточно предаване на съдържание от голям CSV файл.
from flask import Response @app.route('https://cdn.softwaretestinghelp.com/largefile.csv') def send_large_csv(): '''A controller to stream the content of a large csv file''' def gen(): for row in iter_all_rows(): yield ','.join(row) + '
' return Response(gen(), mimetype='text/csv')
Пренасочване на колба
Не винаги е възможно приложението предварително да дефинира отговора въз основа на различните заявки от клиента.
Използваме Flask Redirect в сценарии, където е възможно да се обслужва съдържанието, което може да бъде изпълнено от другите изгледи или местоположения в отговор на заявка. Използваме Flask Redirect заедно с прекъсване със стандартните HTTP кодове за връщане.
Например, в кода по-долу използвахме Redirect с HTTP код 301 и прекъсване с 401.
from flask import Flask, redirect, url_for, request, abort app = Flask(__name__) @app.route('/') def index(): return render_template('log_in.html') # Log In template @app.route('/login',methods = ['POST', 'GET']) def login(): if request.method == 'POST': if request.form['username'] == 'admin' : # if user is admin return redirect(url_for('success')), 301 else: abort(401) # stop processing else: return redirect(url_for('index')) # redirect to another view
Освен това проверете в GreetingsView, където сме използвали Flask redirect и url_for за вътрешно пренасочване на заявка към различен изглед чрез съхраняване на стойностите на поздравления в обекта на сесията. Пренасочването на колба винаги връща обект на отговор със стандартния или зададения код на състоянието на друго място в приложението.
Debugtoolbar на колбата
Вече представихме интерактивния дебъгер на Flask в последния ни урок. В този урок правим още една стъпка, за да улесним отстраняването на грешки на приложението Flask. Веднъж инсталирана, лентата с инструменти за отстраняване на грешки на Flask се показва като наслагване върху приложението Flask.
Инсталирайте лентата с инструменти за отстраняване на грешки на Flask.
pip install flask-debugtoolbar
За да активирате debugtoolbar, отворете файла __init__.py в нашия проект и модифицирайте кода, като добавите следните редове код.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Моля, обърнете внимание, че лентата с инструменти за отстраняване на грешки на Flask е активирана само в режим за отстраняване на грешки. Веднъж активирани, когато презареждате приложението си, ще наблюдавате две неща.
# 1) Лентата за отстраняване на грешки се появява в дясната страна на браузъра. Щракнете и разгънете, за да видите различните функции, предоставени от лентата с инструменти.
# две) Всеки път, когато нова заявка POST бъде изпратена до приложението, тя се прихваща от лентата с инструменти, за да можем да проверим променливите и другите параметри, свързани с отстраняването на грешки на приложението.
Това прихващане по подразбиране може да бъде деактивирано с конфигурацията по-долу.
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
Сега нека напишем няколко теста, за да тестваме нашите възгледи за допълнителните функции, които сме въвели в примерното приложение.
отворете .jnlp файлов прозорец 10
Преди да продължите с тестването, моля, деактивирайте отстраняването на грешки, както е показано по-долу в __init__.py. Като алтернатива можете да коментирате реда по-долу.
app.debug = False
Тестване на изгледи на приложение на колба
Трябва да организираме тестовия код, за да го направим по-управляем. Създайте файл, наречен conftest.py в основната директория, и преместете споменатите по-долу редове от test_hello.py в този файл.
from app import appbuilder import pytest @pytest.fixture def client(): ''' A pytest fixture for test client ''' appbuilder.app.config['TESTING'] = True with appbuilder.app.test_client() as client: yield client
pytest тела се зареждат от pytest по време на изпълнение. Тези тела са налични и се споделят с всички тестове. Определянето на conftest.py в основния път на всеки проект се счита за най-добра практика, защото pytest може да разпознае всички модули в проекта, без да посочва изричен PYTHONPATH.
Добавете още един тест за файла test_hello. Примерен тест е даден по-долу. Извикваме метода get на обекта на клиента и заявяваме очакваната стойност в данните за отговор, съхранявани в resp.data.
По същия начин можете да напишете повече тестове, сочещи към различни изгледи. Ще напишем още тестове в следващите уроци.
def test_greetings(client): ''' A test method to test view hello_greetings''' resp = client.get('/hello/greetings', follow_redirects=True) assert b'Good Morning' in resp.data
Изпълнете тестовете, като използвате командата по-долу от основната директория на проекта.
pytest -v
Тестовото изпълнение дава резултатите от теста в конзолата, както е показано по-долу:
Все още няма повреди. Нека да проектираме още един тест, както е споменато по-долу.
def test_greetings2(client): ''' A test method to test view hello_greetings2 ''' resp = client.get('/hello/greetings2', follow_redirects=True) assert b'Good Morning' in resp.data
Този тест ще се провали, тъй като не дефинирахме никакъв атрибут на съобщението в класа HelloWorld във файла views.py.
След като стартирате тестове с помощта на pytest -v, резултатите, подобни на показаното по-долу изображение, ще бъдат показани на конзолата.
Разделът по-долу обяснява стъпките, които трябва да изпълним, докато изпълняваме тестовете в CI / CD платформа. Използваме Git Action за същия проект.
CI / CD с Git действия
Сега запазваме всички промени във файловете и създаваме фиксиране, като даваме съобщението за този урок. След фиксиране на локалното хранилище, ние изтегляме промени от отдалечения произход с флага –rebase, за да видим дали има някакви конфликти с новите промени на дистанционното. Преоценяваме, за да поддържаме историята последователна.
Използвайте командата по-долу, за да изтеглите и обедините промените от отдалечения източник. Въпреки това ангажирайте промените си, преди да изтеглите промените от отдалечено.
git pull origin master --rebase
Сега проверете местния главен клон и се слейте с клона tutorial-2. След като обединяването е успешно, публикувайте тези промени в главния код на произхода. Това действие ще извика компилациите на целевите платформи. Тестваме този код на Python3.7 и Python 3.8 на Ubuntu най-новите.
Заключение
В този урок видяхме как работят шаблоните в рамката на Flask. Очертахме стъпките за създаване и изобразяване на шаблони на колби с дефинирани от потребителя стойности, използвайки променливи и изрази.
Видяхме и примери за предварително дефиниран изглед BaseView на приставката Flask Appbuilder. Този изглед може лесно да бъде подкласиран от разработчиците на Flask за създаване на персонализирани изгледи.
Обхванатите досега концепции помагат на читателите бързо да създават статични и динамични уебсайтове с помощта на колбата без бекенд на базата данни. Ще обясним как да четем и пишем данни от и към базите данни с ModelView в следващия урок, когато преминем през концепцията за използване на бази данни с Flask.
=> Прочетете учебната серия Easy Flask
Препоръчително четене
- Урок за Python Flask - Въведение в Flask за начинаещи
- Модели за дизайн на колби и най-добри практики за уеб приложения
- Flask API Урок с пример | Разширяване на колбата с API
- Стандартна библиотека с шаблони (STL): Кратко въведение
- Какво е сценарий на теста: Шаблон на тестов сценарий с примери
- Примерен шаблон за тестови случаи с примери за тестови случаи [Изтегляне]
- Примерен шаблон за доклад за изпитване за приемане с примери
- Шаблони в C ++ с примери