flask template form
Ovaj vodič objašnjava što su predložak tikvice, obrazac, pogled, odgovor i preusmjeravanje s praktičnim primjerima:
Općenito, predlošci se koriste u programiranju za ponovnu upotrebu dijela teksta s različitim podacima. Što se tiče web razvoja, dizajneri koriste predloške za prikaz podataka u obliku koji je čitljiv i privlačan ljudskim čitateljima.
Dizajn predloška obično uključuje upotrebu jezika zbog složenosti izazvane ljudskom interakcijom.
=> Ovdje pogledajte vodič za početnike u tikvicama
Što ćete naučiti:
Uvod
Flask koristi mehanizam za predloške pod nazivom Jinja2, koji prikazuje ponašanje aplikacije na temelju korisničke razine interakcije. Predložak Jinja koristi varijable, izraze i oznake.
Varijable i izrazi zamjenjuju se vrijednostima tijekom izvođenja prije prikazivanja stranice u pregledniku. Jinja oznake pomažu u pisanju logike i kontroliraju izjave u predlošku Flask.
Pogled na tikvicu
Pojam Flask pogleda izveden je iz prevladavajućeg uzorka dizajna web aplikacija nazvanog Model-View-Controller. Pogled je jedan od tri međusobno povezana elementa u ovoj paradigmi, gdje se bavi aplikacijskom logikom. Pogled brine o prezentaciji informacija Korisniku.
U našem prethodnom vodiču osmislili smo pogled potklasiranjem klase BaseView Flask-Appbuilder-a. U sljedećem dijelu ovog vodiča proširit ćemo naš posljednji primjer i predstaviti načine na koje se Prilagodbe mogu prilagoditi.
Predložak tikvice
Počnimo i napišite svoj prvi predložak. Stvorite datoteku koja se naziva hello.html u direktoriju predložaka.
U tu datoteku napišite sljedeći kod i spremite ga.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %}
Predložak za petlju
U gornjem predlošku tikvice koristili smo for petlju za iterariranje stavki s popisa. U našem kontroleru ili obrađivaču predložak smo proslijedili popis s vrijednostima pozdrava. Unutar predloška pristupamo svakoj stavci koristeći sintaksu {{item}}.
Predložak ako je blok
Osim toga, zabilježite upotrebu izjave if. Ovdje testiramo stavku za Jutro i stavljamo je podebljano i u kurzivu.
Krenimo sada da bismo saznali više o konceptima obrazaca za tikvice.
Oblici tikvica
Jedan od najvažnijih aspekata predložaka je uzimanje podataka od korisnika i pisanje pozadinske logike na temelju tog unosa. Stvorimo obrazac.
Za generiranje obrasca koristimo Flask-Appbuilder SimpleFormView. Međutim, napravimo prvo obrazac. Uz stvaranje obrasca, trebamo upotrijebiti naredbu fab create-admin za stvaranje administratora.
Stoga upotrijebite naredbu prije pokretanja razvojnog poslužitelja kako bi naknadno stvoreni pogledi i obrasci mogli biti provjereni s prijavljenim korisnikom. Prijavljujemo se s korisnikom administratora i stalno provjeravamo jesu li stvoreni pogledi vidljivi u izborniku, kao što je prikazano na snimkama zaslona.
Izradite administratora
Upotrijebite naredbu u nastavku za stvaranje administrativnog korisnika.
tikvica fab create-admin
Prijavite se s administratorskim vjerodajnicama
- Kliknite na Login nakon što prijeđete na http: // localhost: 8080.
- Prijavite se pomoću vjerodajnica za administratore stvorenih u prethodnom odjeljku.
- Kliknite kategoriju Moji obrasci da biste pristupili svojim pogledima.
Bilješka: Posljednji korak moći ćete izvesti tek nakon dodavanja pogleda na zadani izbornik prikazan na navigacijskoj traci.
Krenimo i stvorimo neke poglede utemeljene na formi.
Stvorite datoteku koja se naziva forms.py u direktoriju aplikacije i u nju napišite sljedeći kod.
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())
Stvorili smo obrazac temeljen na DynamicForm iz Flask-Appbuilder. Postoje četiri tekstualna polja. Upućujemo svoj primjer pozdrava. Od četiri polja, dva su obavezna, a dva neobavezna, jer smo za prva dva pozdrava spomenuli vrijednosti za validatore.
Ajmo sada stvoriti prikaz za ovaj obrazac. Zapišite sljedeće redove koda u datoteku 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'))
U našem gornjem pogledu imamo dvije metode nazvane form_get i form_post za popunjavanje zadanih vrijednosti u polja obrazaca i čitanje unesenih vrijednosti nakon što obrazac bude poslan iz preglednika.
GreetingsView prikazuje obrazac, kao što je prikazano na donjoj slici.
Također koristimo objekt sesije Flask za spremanje vrijednosti polja u form_post kako bismo mogli pristupiti istom u odgovarajućem novom prikazu koji ćemo napisati.
Izmijenimo sada klasu HelloWorld i dodajte drugu metodu za prikaz pozdrava. Nazvat ćemo ga hello_greetings2.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session('greetings') return render_template('hello.html', greetings=greetings)
U ovom prikazu čitamo vrijednosti iz objekta sesije i koristimo predložak renderiranja tikvice za prikaz tih vrijednosti u HTML-u okrenutom prema korisniku. Primijetite da je hello_greetings2 alternativni način postizanja iste funkcionalnosti slične hello_greetings.
Jedina je razlika u tome što pomoću hello_greetings2 prikazujemo vrijednosti koje je unosio Korisnik, a u hello_greetings nismo uzimali nikakve unose od Korisnika i tvrdo ih kodirali tijekom pisanja prikaza mapiranog na odgovarajuću rutu.
Odgovor tikvice
Prilično je rijetko da ćete u kodu pronaći eksplicitnu upotrebu odgovora Flask. Klasa odgovora u tikvici samo je podrazred klase odgovora iz Werkzuegove klase odgovora, koja zauzvrat potklasira svoju klasu ResponseBase.
Objekt Flask Response interno formira Flask kad god pozovemo naredbu return ili metodu kao što je render_template.
Nadalje, možemo prilagoditi kod odgovora i vrstu sadržaja ako je to potrebno kao dio izjave za povratak u našim pogledima, kao što je prikazano u modificiranom prikazu HelloWorld u nastavku.
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'
Izravna uporaba klase Flask’s Response može se pokriti u slučaju korištenja kada strujimo sadržaj umjesto da odjednom vraćamo puni sadržaj zbog ograničenja veličine datoteke i mrežne propusnosti.
U nastavku smo prikazali jedan primjer strujanja sadržaja iz velikog CSV-a.
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')
Preusmjeravanje tikvice
Nije uvijek moguće da aplikacija unaprijed definira odgovor na temelju različitih zahtjeva klijenta.
Preusmjeravanje Flask koristimo u scenarijima gdje je moguće poslužiti sadržaj koji mogu ispuniti drugi prikazi ili lokacije kao odgovor na zahtjev. Koristimo Flask Redirect zajedno s prekidom sa standardnim HTTP povratnim kodovima.
Na primjer, u donjem kodu koristili smo Preusmjeravanje s HTTP kodom 301, a prekinuti 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 view
Nadalje, provjerite u GreetingsView gdje smo koristili Flask redirect i url_for za interno preusmjeravanje zahtjeva na drugi pogled spremanjem vrijednosti pozdrava u objekt sesije. Preusmjeravanje tikvice uvijek vraća objekt odgovora sa zadanim ili zadanim statusnim kodom na drugo mjesto u aplikaciji.
Debugtoolbar tikvice
Već smo uveli interaktivni program za uklanjanje pogrešaka Flask u našem zadnjem vodiču. U ovom uputstvu poduzimamo još jedan korak kako bismo olakšali otklanjanje pogrešaka aplikacije Flask. Jednom instalirana, alatna traka Flask Debug prikazuje se kao prekrivač preko aplikacije Flask.
Instalirajte alatnu traku Flask Debug.
pip install flask-debugtoolbar
Da biste aktivirali debugtoolbar, otvorite datoteku __init__.py u našem projektu i izmijenite kôd dodavanjem sljedećih redaka koda.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Imajte na umu da je alatna traka za otklanjanje pogrešaka Flask omogućena samo u načinu otklanjanja pogrešaka. Jednom omogućeno, kad ponovo učitate svoju aplikaciju, primijetit ćete dvije stvari.
# 1) Alatna traka za otklanjanje pogrešaka pojavljuje se s desne strane preglednika. Kliknite ga i proširite da biste vidjeli razne značajke koje pruža alatna traka.
#dva) Kad god se novi zahtjev POST pošalje aplikaciji, presreće ga alatna traka kako bismo mogli pregledati varijable i ostale parametre koji se odnose na otklanjanje pogrešaka u aplikaciji.
Ovo zadano presretanje može se onemogućiti u donjoj konfiguraciji.
app.config('DEBUG_TB_INTERCEPT_REDIRECTS') = False
Napišimo sada nekoliko testova kako bismo testirali naše poglede na dodatne značajke koje smo uveli u primjeru aplikacije.
koji je najbolji adblok za krom
Prije nastavka testiranja, onemogućite ispravljanje pogrešaka kao što je prikazano u __init__.py. Alternativno, možete komentirati donji redak.
app.debug = False
Testiranje pogleda aplikacije tikvice
Moramo organizirati kôd za testiranje kako bismo ga učinili lakšim za upravljanje. Stvorite datoteku koja se zove conftest.py u korijenskom direktoriju i premjestite dolje spomenute retke s test_hello.py u ovu datoteku.
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 uređaji učitavaju se pytestom u vrijeme izvođenja. Ovi su uređaji dostupni i dijele se sa svim testovima. Definiranje conftest.py u korijenskoj putanji bilo kojeg projekta smatra se najboljom praksom, jer pytest može prepoznati sve module u projektu bez navođenja eksplicitnog PYTHONPATH-a.
Dodajte još jedan test za datoteku test_hello. Primjer testa dan je u nastavku. Nazivamo metodu klijentskog objekta i utvrđujemo očekivanu vrijednost u podacima odgovora pohranjenim u resp.data.
Slično tome, možete napisati više testova koji ukazuju na različite poglede. Napisat ćemo još testova u sljedećim vodičima.
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
Pokrenite testove pomoću naredbe u nastavku iz korijenskog direktorija projekta.
pytest -v
Probno pokretanje daje rezultate ispitivanja u konzoli, kao što je prikazano dolje:
Još nema kvarova. Osmislimo još jedan test, kao što je spomenuto u nastavku.
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
Ovaj test neće uspjeti jer nismo definirali nijedan atribut poruke u klasi HelloWorld u datoteci views.py.
Jednom kada pokrenete testove pomoću pytest -v, tada će se na konzoli ponovno prikazati rezultati slični dolje prikazanoj slici.
Sljedeći odjeljak objašnjava korake koje moramo obaviti tijekom izvođenja testova na CI / CD platformi. Za isti projekt koristimo Git Action.
CI / CD s Git akcijama
Sada spremamo sve promjene u datotekama i stvaramo urezivanje davanjem poruke za ovaj vodič. Nakon urezivanja na lokalnom spremištu, povlačimo promjene iz udaljenog izvora s oznakom –rebase da vidimo ima li sukoba s novim promjenama na daljinskom. Prebazujemo kako bi povijest bila dosljedna.
Upotrijebite donju naredbu za povlačenje i spajanje promjena iz udaljenog izvora. No, izvršite promjene prije povlačenja promjena s daljinskog upravljača.
git pull origin master --rebase
Sada provjerite lokalnu glavnu granu i stopite se s granom tutorial-2. Nakon što je spajanje uspješno, objavite te promjene na matičnoj strani podrijetla. Ova će radnja pozvati gradnje na ciljnim platformama. Testiramo ovaj kod na Python3.7 i Python 3.8 na Ubuntu najnovijem.
Zaključak
U ovom uputstvu vidjeli smo kako predlošci rade u okviru Flask. Iznijeli smo korake stvaranja i prikazivanja predložaka tikvica s korisnički definiranim vrijednostima pomoću varijabli i izraza.
Također smo vidjeli primjere unaprijed definiranog pogleda BaseView dodatka Flask Appbuilder. Ovaj prikaz programeri Flaska mogu lako podklasirati kako bi stvorili prilagođene poglede.
Do sada obrađeni koncepti pomažu čitateljima da brzo stvore statičke i dinamične web stranice pomoću tikvice bez pozadinske baze podataka. Objasnit ćemo kako čitati i pisati podatke iz i u baze podataka s ModelView u sljedećem uputstvu kada prođemo kroz koncept korištenja baza podataka s Flaskom.
=> Pročitajte seriju Easy Training za tikvice
Preporučena literatura
- Vodič za Python tikvice - Uvod u tikvicu za početnike
- Uzorci dizajna tikvica i najbolji primjeri iz prakse za web aplikacije
- Vodič za API tikvice s primjerom | Proširenje tikvice s API-ima
- Biblioteka standardnih predložaka (STL): Kratki uvod
- Što je scenarij testa: Predložak scenarija testa s primjerima
- Uzorak predloška test primjera s primjerima test primjera (preuzmi)
- Uzorak predloška za izvješće o ispitivanju prihvaćanja s primjerima
- Predlošci na C ++ s primjerima