flask template form
Ta vadnica s praktičnimi primeri pojasnjuje, kaj so predloga bučke, obrazec, pogled, odziv in preusmeritev:
Na splošno se pri programiranju predloga uporablja za ponovno uporabo dela besedila z različnimi podatki. Kar zadeva spletni razvoj, oblikovalci uporabljajo predloge za prikaz podatkov v obliki, ki je berljiva in privlačna za bralce.
Zasnova predloge na splošno vključuje uporabo jezika zaradi zapletenosti, ki jo povzroča človeška interakcija.
=> Tu si oglejte vodnik za bučke
Kaj se boste naučili:
Uvod
Flask uporablja mehanizem za predloge, imenovan Jinja2, ki prikazuje vedenje aplikacije na podlagi uporabnikove ravni interakcije. Predloga Jinja uporablja spremenljivke, izraze in oznake.
Spremenljivke in izrazi se med izvajanjem pred upodabljanjem strani v brskalniku zamenjajo z vrednostmi. Oznake Jinja pomagajo pri pisanju logike in nadzorujejo stavke v predlogi Flask.
Pogled bučke
Pojem Flask view izhaja iz razširjenega vzorca oblikovanja spletnih aplikacij, imenovanega Model-View-Controller. Pogled je eden od treh med seboj povezanih elementov v tej paradigmi, kjer se ukvarja z aplikacijsko logiko. Pogled skrbi za predstavitev informacij uporabniku.
V prejšnji vadnici smo zasnovali pogled s podrazvrstitvijo razreda BaseView Flask-Appbuilderja. V naslednjem delu te vadnice bomo razširili svoj zadnji primer in predstavili načine prilagajanja pogledov.
Predloga bučke
Začnimo in napišite prvo predlogo. Ustvarite datoteko z imenom hello.html v imeniku predlog.
V to datoteko napišite naslednjo kodo in jo shranite.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %} Predloga za zanko
V zgornji predlogi Flask smo uporabili zanko for za ponovitev elementov na seznamu. V našem krmilniku ali vodniku smo predlogi poslali seznam z vrednostmi pozdravov. Znotraj predloge dostopamo do vsakega elementa s sintakso {{item}}.
Predloga, če je blok
Poleg tega si zapišite uporabo izjave if. Tu preizkusimo element za Jutro in ga naredimo krepko in ležeče.
Zdaj pa stopimo naprej, če želite izvedeti več o konceptih Flask Forms.
Obrazci za bučke
Eden najpomembnejših vidikov predloge je sprejemanje vnosov uporabnikov in pisanje zaledne logike na podlagi tega vhoda. Ustvarimo obrazec.
Za upodabljanje obrazca uporabljamo Flask-Appbuilder SimpleFormView. Vendar najprej ustvarimo obrazec. Poleg ustvarjanja obrazca moramo za ustvarjanje skrbniškega uporabnika uporabiti ukaz bučke fab create-admin.
Zato uporabite ukaz pred zagonom razvojnega strežnika, da lahko pozneje ustvarjene poglede in obrazce preveri z prijavljenim uporabnikom. Prijavite se z skrbniškim uporabnikom in preverjamo, ali so ustvarjeni pogledi vidni v meniju, kot je prikazano na posnetkih zaslona.
Ustvari skrbnika
Uporabite spodnji ukaz za ustvarjanje skrbniškega uporabnika.
bučka fab create-admin
Prijavite se s skrbniškimi poverilnicami
- Po prijavi na http: // localhost: 8080 kliknite Login.

- Prijavite se s poverilnicami skrbnika, ustvarjenimi v prejšnjem razdelku.

- Za dostop do pogledov kliknite kategorijo Moji obrazci.

Opomba: Zadnji korak boste lahko izvedli šele po dodajanju pogledov v privzeti meni, prikazan v vrstici za krmarjenje.
Ustvarimo nekaj pogledov, ki temeljijo na obliki.
V imeniku aplikacije ustvarite datoteko z imenom forms.py in vanjo vpišite naslednjo kodo.
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())Ustvarili smo obrazec, ki temelji na DynamicForm iz Flask-Appbuilder. Obstajajo štiri besedilna polja. Primer našega pozdrava. Od štirih polj sta dve obvezni, dve pa neobvezni, ker smo za prva dva pozdrava omenili vrednosti za validacije.
Zdaj pa ustvarimo pogled za ta obrazec. V datoteko views.py zapišite naslednje vrstice kode.
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'))Po našem zgornjem pogledu imamo dve metodi, imenovani form_get in form_post za zapolnitev privzetih vrednosti v poljih obrazcev in branje vnesenih vrednosti, ko je obrazec oddan iz brskalnika.
GreetingsView prikaže obrazec, kot je prikazano na spodnji sliki.

Uporabljamo tudi objekt seje Flask za shranjevanje vrednosti polja v form_post, tako da lahko do istega dostopamo v ustreznem novem pogledu, ki ga bomo napisali.
Spremenimo zdaj razred HelloWorld in dodajte še eno metodo za prikaz pozdravov. Poimenovali ga bomo hello_greetings2.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session('greetings') return render_template('hello.html', greetings=greetings)V tem pogledu beremo vrednosti iz predmeta seje in s predlogo upodabljanja bučke prikažemo te vrednosti v uporabniško usmerjenem HTML-ju. Upoštevajte, da je hello_greetings2 nadomestni način doseganja enake funkcionalnosti, podobne hello_greetings.
Edina razlika je v tem, da s pomočjo hello_greetings2 prikazujemo vrednosti, ki jih je vnesel uporabnik, v hello_greetings pa uporabnika nismo vzeli nobenih vnosov in jih trdo kodirali med pisanjem pogleda, preslikanega na ustrezno pot.
Odziv bučke
Dokaj redko je, da boste v kodi našli izrecno uporabo odziva Flask. Razred odziva v bučki je le podrazred razreda odziv iz Werkzuegovega odziva, ki nato podrazredi svoj razred odziva.
Objekt Flask Response interno oblikuje Flask, kadar koli pokličemo stavek return ali metodo, kot je render_template.
Poleg tega lahko prilagodimo kodo odziva in vrsto vsebine, če je to potrebno kot del stavka return v naših pogledih, kot je prikazano v spremenjenem pogledu HelloWorld spodaj.
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'Neposredna uporaba razreda Flask’s Response je lahko zajeta v primeru uporabe, ko vsebino predvajamo, namesto da vrnemo celotno vsebino hkrati zaradi omejitev velikosti datoteke in pasovne širine omrežja.
Spodaj smo prikazali en primer pretakanja vsebine iz velikega CSV-ja.
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')Preusmeritev bučke
Za aplikacijo ni vedno mogoče vnaprej določiti odziva na podlagi različnih zahtev odjemalca.
Preusmeritev Flask uporabljamo v scenarijih, kjer je mogoče v odgovor na zahtevo vstaviti vsebino, ki jo lahko izpolnijo drugi pogledi ali lokacije. Flask Redirect uporabljamo skupaj s prekinitvijo s standardnimi povratnimi kodami HTTP.
Na primer, v spodnji kodi smo uporabili preusmeritev s kodo HTTP 301 in prekinili s 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 viewPoleg tega preverite v programu GreetingsView, kjer smo uporabili Flask redirect in url_for za interno preusmeritev zahteve v drug pogled s shranjevanjem vrednosti pozdravov v predmetu seje. Preusmeritev bučke vedno vrne odzivni objekt s privzeto kodo ali statusno kodo na drugo mesto v aplikaciji.
Debugtoolbar bučke
Flaskov interaktivni razhroščevalec smo že predstavili v naši zadnji vadnici. V tej vadnici naredimo še en korak za lažje odpravljanje napak aplikacije Flask. Ko je orodna vrstica Flask Debug nameščena, je prikazana kot prosojnica nad aplikacijo Flask.
Namestite orodno vrstico za odpravljanje napak Flask.
pip install flask-debugtoolbarČe želite aktivirati razhroščevalno vrstico, odprite datoteko __init__.py v našem projektu in spremenite kodo tako, da dodate naslednje vrstice kode.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)Upoštevajte, da je orodna vrstica za odpravljanje napak Flask omogočena samo v načinu za odpravljanje napak. Ko enkrat omogočite aplikacijo, boste ob ponovnem nalaganju opazili dve stvari.
# 1) Orodna vrstica za odpravljanje napak se prikaže na desni strani brskalnika. Kliknite in razširite, da si ogledate različne funkcije, ki jih ponuja orodna vrstica.

#two) Vsakič, ko se v aplikacijo pošlje nova zahteva POST, jo orodna vrstica prestreže, da lahko pregledamo spremenljivke in druge parametre, ki se nanašajo na odpravljanje napak aplikacije.

To privzeto prestrezanje lahko onemogočite s spodnjo konfiguracijo.
app.config('DEBUG_TB_INTERCEPT_REDIRECTS') = False 
Zdaj pa napišite nekaj testov, s katerimi bomo preizkusili svoje poglede na dodatne funkcije, ki smo jih uvedli v vzorčni aplikaciji.
okna za popravilo in optimizacijo pc 10
Preden nadaljujete s testiranjem, onemogočite odpravljanje napak, kot je prikazano spodaj v __init__.py. Lahko pa komentirate spodnjo vrstico.
app.debug = FalseTestiranje pogledov aplikacije v bučki
Moramo organizirati preskusno kodo, da postane bolj obvladljiva. V korenskem imeniku ustvarite datoteko z imenom conftest.py in spodaj omenjene vrstice premaknite iz test_hello.py v to datoteko.
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 clientpytest naprave se med izvajanjem naloži pytest. Te naprave so na voljo in se delijo z vsemi testi. Določitev conftest.py v korenski poti katerega koli projekta velja za najboljšo prakso, saj lahko pytest prepozna vse module v projektu, ne da bi izrecno navedel PYTHONPATH.
Dodajte še en test za datoteko test_hello. Primer testa je spodaj. Pokličemo metodo odjemalčevega predmeta in uveljavimo pričakovano vrednost v odzivnih podatkih, shranjenih v resp.data.
Podobno lahko napišete več testov, ki kažejo na različne poglede. V naslednjih vajah bomo napisali več testov.
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.dataZaženite teste z uporabo spodnjega ukaza iz korenskega imenika projekta.
pytest -vPreizkusni poizkusi prikažejo rezultate preskusa v konzoli, kot je prikazano spodaj:

Napak še ni. Oblikujmo še en test, kot je omenjeno spodaj.
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.dataTa test ne bo uspel, saj v razredu HelloWorld v datoteki views.py nismo opredelili nobenega atributa sporočila.
Ko zaženete teste s pomočjo pytest -v, se bodo na konzoli spet prikazali rezultati, podobni spodnji sliki.

Spodnji razdelek pojasnjuje korake, ki jih moramo izvesti med izvajanjem testov v platformi CI / CD. Za isti projekt uporabljamo Git Actions.
CI / CD z Git Akcijami
Zdaj shranimo vse spremembe v datotekah in ustvarimo objavo, tako da damo sporočilo za to vadnico. Po odobritvi v lokalnem repozitoriju iz oddaljenega izvora potegnemo spremembe z zastavico –rebase, da preverimo, ali obstajajo kakšni konflikti z novimi spremembami na oddaljenem. Prenovimo, da ohranimo doslednost zgodovine.
Uporabite spodnji ukaz, da povlečete in združite spremembe z oddaljenega izvora. Preden pa povlečete spremembe z oddaljenega, jih zavežite.
git pull origin master --rebaseZdaj preverite lokalno vejo in se združite z vejo tutorial-2. Ko je združitev uspešna, objavite te spremembe v glavnem mestu izvora. To dejanje bo sprožilo gradnje na ciljnih platformah. To kodo preizkušamo na Python3.7 in Python 3.8 na najnovejših Ubuntu.
Zaključek
V tej vadnici smo videli, kako predloge delujejo v okviru Flask. Opisali smo korake ustvarjanja in upodabljanja predlog bučk z uporabniško določenimi vrednostmi z uporabo spremenljivk in izrazov.
Videli smo tudi primere vnaprej določenega pogleda BaseView vtičnika Flask Appbuilder. Razvijalci Flask lahko ta pogled zlahka podrazvrstijo, da ustvarijo poglede po meri.
Dosedanji koncepti bralcem pomagajo pri hitrem ustvarjanju statičnih in dinamičnih spletnih mest z uporabo bučke brez zaledja baze podatkov. Kako bomo brali in pisali podatke iz in v zbirke podatkov z ModelView, bomo razložili v naslednji vadnici, ko bomo prešli skozi koncept uporabe baz podatkov s Flaskom.
=> Preberite serijo Easy Flask Training Series
Priporočeno branje
- Vadnica za bučko Python - Uvod v bučko za začetnike
- Vzorci za oblikovanje bučk in najboljši postopki za spletne aplikacije
- Vadnica API Flask s primerom | Razširitev bučke z API-ji
- Knjižnica standardnih predlog (STL): kratek uvod
- Kaj je testni scenarij: Predloga testnega scenarija z primeri
- Vzorčna predloga testnega primera s primeri testnega primera (prenos)
- Vzorčna predloga za poročilo o preizkusu sprejemljivosti s primeri
- Predloge v jeziku C ++ z primeri