flask template form
Denne vejledning forklarer, hvad der er flaskeskabelon, form, visning, respons og omdirigering med praktiske eksempler:
Generelt bruges skabeloner i programmering til at genbruge en del af tekst med forskellige data. Med hensyn til webudvikling bruger designere skabeloner til at vise data i en form, der er læselig og attraktiv for menneskelige læsere.
Et skabelondesign involverer generelt brugen af et sprog på grund af kompleksiteten af menneskelig interaktion.
=> Se på Flask Beginners Guide her
Hvad du vil lære:
Introduktion
Flask bruger en skabelonmotor kaldet Jinja2, der viser en applikations opførsel baseret på brugerens interaktionsniveau. En Jinja-skabelon bruger variabler, udtryk og tags.
Variabler og udtryk erstattes med værdier under runtime før sidegengivelse i browseren. Jinja-tags hjælper med at skrive logik og styre udsagn i flaskeskabelonen.
Flask View
Begrebet flaskevisning er afledt af et udbredt design af et webapplikationsdesign kaldet Model-View-Controller. A View er et af de tre sammenkoblede elementer i dette paradigme, hvor det beskæftiger sig med applikationslogik. Visningen tager sig af præsentationen af information til brugeren.
I vores tidligere vejledning designede vi en visning ved at underklasse BaseView-klassen i Flask-Appbuilder. I den efterfølgende del af denne vejledning udvider vi vores sidste eksempel og præsenterer måder, hvorpå Visninger kan tilpasses.
Flaskeskabelon
Lad os begynde og skrive vores første skabelon. Opret en fil kaldet hello.html under skabelonmappen.
Skriv følgende kode i den fil, og gem den.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %}
Skabelon til løkke
I ovenstående flaskeskabelon har vi brugt en for-løkke til at gentage elementerne på listen. I vores controller eller handler sendte vi en liste med værdier af hilsner til skabelonen. Inde i skabelonen får vi adgang til hvert element ved hjælp af {{item}} syntaksen.
Skabelon hvis blok
Desuden skal du notere brugen af en if-sætning. Her tester vi varen til morgen og gør den fed og kursiv.
Lad os gå videre for at lære mere om begreberne Flask Forms.
Flaskeformularer
Et af de mest afgørende aspekter ved skabeloner er at tage input fra brugerne og skrive backend-logik baseret på dette input. Lad os oprette en formular.
Vi bruger Flask-Appbuilder SimpleFormView til at gengive vores formular. Lad os dog først oprette en formular. Ud over oprettelsen af en formular skal vi bruge kommandoen kolbe fab create-admin til at oprette en admin-bruger.
Brug derfor kommandoen inden du starter udviklingsserveren, så de efterfølgende oprettede visninger og formularer kan valideres med en logget bruger. Vi logger ind med adminbrugeren og fortsætter med at validere, at oprettede visninger er synlige under menuen som vist i skærmbillederne.
Opret administrator
Brug nedenstående kommando til at oprette en administratorbruger.
kolbe fab create-admin
Log ind med administratoroplysningerne
- Klik på Login, når du har navigeret til http: // localhost: 8080.
- Log ind med administratoroplysningerne, der blev oprettet i det foregående afsnit.
- Klik på kategorien Mine formularer for at få adgang til dine synspunkter.
Bemærk: Du vil kun være i stand til at udføre det sidste trin, når du har tilføjet visningerne til standardmenuen, der vises i navlinjen.
Lad os gå videre og oprette nogle formbaserede synspunkter.
Opret en fil kaldet forms.py under app-biblioteket, og skriv følgende kode i den.
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())
Vi har oprettet en formular baseret på DynamicForm fra Flask-Appbuilder. Der er fire tekstfelter. Vi udvider vores hilseneksempel. Ud af de fire felter er to obligatoriske og to er valgfri, fordi vi for de første to hilsener har nævnt værdierne for validatorer.
Lad os nu oprette en visning til denne formular. Skriv disse følgende kodelinjer i filvisningerne.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'))
Efter vores opfattelse ovenfor har vi to metoder kaldet form_get og form_post til at udfylde standardværdierne i felterne i formularerne og læse de indtastede værdier, når formularen er indsendt fra henholdsvis browseren.
GreetingsView viser formularen som vist i nedenstående billede.
Vi bruger også et Flask-session-objekt til at gemme feltværdierne i form_post, så vi kan få adgang til det samme i den tilsvarende nye visning, som vi er ved at skrive.
Lad os nu ændre HelloWorld-klassen og tilføje en anden metode til at vise hilsnerne. Vi kalder det hej_hilsener2.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session['greetings'] return render_template('hello.html', greetings=greetings)
I denne visning læser vi værdierne fra sessionobjektet og bruger Flask render-skabelonen til at vise disse værdier i den brugervendte HTML. Bemærk, at hello_greetings2 er en alternativ måde at opnå den samme funktionalitet på som hello_greetings.
Den eneste forskel er, at ved hjælp af hello_greetings2 viser vi de værdier, der er indtastet af brugeren, og i hello_greetings tog vi ingen input fra brugeren og hardkodede dem, mens vi skrev visningen kortlagt til den respektive rute.
Flaskesvar
Det er ret sjældent, at du finder den eksplicitte brug af Flask-respons i koden. Responsklasse i Flask er kun en underklasse af Response-klassen fra Werkzuegs Response-klasse, som igen underklasserer sin ResponseBase-klasse.
Flask Response-objekt dannes internt af Flask, når vi kalder en returerklæring eller en metode som render_template.
Desuden kan vi tilpasse svarkoden og indholdstypen, hvis det kræves som en del af returerklæringen i vores synspunkter, som vist i den modificerede HelloWorld-visning nedenfor.
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'
Direkte brug af Flask's Response-klasse kan dækkes i en brugssag, når vi streamer indholdet i stedet for at returnere det fulde indhold på én gang på grund af begrænsningerne i filstørrelse og netværksbåndbredde.
Vi har vist nedenfor et eksempel på streaming af indholdet fra en stor 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 omdirigering
Det er ikke altid muligt for en applikation at foruddefinere svaret baseret på de forskellige anmodninger fra klienten.
Vi bruger Flask Redirect i scenarier, hvor det er muligt at tjene det indhold, der kan opfyldes af de andre visninger eller placeringer som svar på en anmodning. Vi bruger Flask Redirect sammen med afbryde med standard HTTP-returkoder.
For eksempel, i nedenstående kode har vi brugt Redirect med HTTP-kode 301 og afbrudt med 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
Kontroller desuden i GreetingsView, hvor vi har brugt Flask-omdirigering og url_for til at omdirigere en anmodning internt til en anden visning ved at gemme hilsnernes værdier i sessionsobjektet. Flask omdirigering returnerer altid et svarobjekt med standardkoden eller statuskoden til en anden placering i applikationen.
Kolbe Debugtoolbar
Vi introducerede allerede Flasks interaktive debugger i vores sidste tutorial. I denne vejledning tager vi endnu et skridt for at gøre fejlfinding af Flask-applikationen lettere. Efter installation er værktøjslinjen Flask Debug vist som et overlay over Flask-applikationen.
Installer værktøjslinjen Flask Debug.
pip install flask-debugtoolbar
For at aktivere debugtoolbar skal du åbne filen __init__.py i vores projekt og ændre koden ved at tilføje følgende kodelinjer.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Bemærk, at værktøjslinjen Flask debug kun er aktiveret i debug-tilstand. Når du er aktiveret, når du genindlæser din applikation, vil du observere to ting.
# 1) Fejlfindingsværktøjslinje vises i højre side af browseren. Klik og udvid den for at se de forskellige funktioner, der leveres af værktøjslinjen.
#to) Hver gang en ny POST-anmodning sendes til applikationen, bliver den aflyttet af værktøjslinjen, så vi kan inspicere variablerne og de andre parametre, der vedrører fejlfinding af applikationen.
Denne standardaflytning kan deaktiveres med nedenstående konfiguration.
app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False
Lad os nu skrive et par tests for at teste vores synspunkter for de ekstra funktioner, som vi har introduceret i prøveapplikationen.
bedste spilvirksomhed at arbejde for
Inden du går videre med testen, skal du deaktivere fejlretning som vist nedenfor i __init__.py. Alternativt kan du kommentere nedenstående linje.
app.debug = False
Test af flaskeapplikationsvisninger
Vi er nødt til at organisere testkoden for at gøre den mere håndterbar. Opret en fil kaldet conftest.py i rodmappen, og flyt nedenstående linjer fra test_hello.py til denne fil.
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-inventar indlæses af pytest i løbetid. Disse armaturer er tilgængelige og deles med alle tests. Definition af en conftest.py i rodstien til ethvert projekt betragtes som en bedste praksis, fordi pytest kan genkende alle moduler i projektet uden at angive en eksplicit PYTHONPATH.
Tilføj endnu en test til filen test_hello. Nedenfor gives et eksempel på en test. Vi kalder klientobjektets get-metode og hævder den forventede værdi i svardata gemt i resp. Data.
På samme måde kan du skrive flere tests, der peger på forskellige synspunkter. Vi skal skrive flere tests i de efterfølgende tutorials.
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
Kør testene ved hjælp af nedenstående kommando fra projektets rodmappe.
pytest -v
Testkørsel producerer testresultaterne i konsollen som vist nedenfor:
Der er ingen fejl endnu. Lad os designe endnu en test som nævnt nedenfor.
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
Denne test mislykkes, da vi ikke definerede nogen meddelelsesattribut i HelloWorld-klassen i views.py-filen.
Når du har kørt tests ved hjælp af pytest -v, vises resultaterne svarende til det nedenfor viste billede igen på konsollen.
Afsnittet nedenfor forklarer de trin, vi skal udføre, når vi kører testene på en CI / CD-platform. Vi bruger Git Actions til det samme projekt.
CI / CD med Git-handlinger
Vi gemmer nu alle ændringer i filerne og opretter en forpligtelse ved at give beskeden til denne tutorial. Efter at have forpligtet os til det lokale arkiv trækker vi ændringer fra den fjerne oprindelse med –rebase-flag for at se, om der er nogen konflikt med de nye ændringer på fjernbetjeningen. Vi baserer om for at holde historien konsistent.
Brug nedenstående kommando til at trække og flette ændringerne fra den fjerne oprindelse. Foretag dog dine ændringer, inden du trækker ændringerne fra fjernbetjeningen.
git pull origin master --rebase
Tjek nu den lokale mastergren, og flet den sammen med tutorial-2-grenen. Når fletningen er vellykket, skal du offentliggøre disse ændringer til oprindelsesmesteren. Denne handling påberåber builds på målplatforme. Vi tester denne kode på Python3.7 og Python 3.8 på Ubuntu senest.
Konklusion
I denne vejledning så vi, hvordan skabeloner fungerer i Flask-rammen. Vi skitserede trinene til oprettelse og gengivelse af kolbeskabeloner med brugerdefinerede værdier ved hjælp af variabler og udtryk.
Vi så også eksempler på en foruddefineret visning BaseView af Flask Appbuilder-pluginnet. Denne visning kan let underklasseres af Flask-udviklere for at oprette brugerdefinerede visninger.
Indtil videre dækkede begreber hjælper læserne med hurtigt at oprette statiske og dynamiske websteder ved hjælp af kolben uden en database-backend. Vi forklarer, hvordan man læser og skriver data fra og til databaserne med ModelView i den næste tutorial, når vi gennemgår konceptet med at bruge databaser med Flask.
=> Læs gennem Easy Flask Training Series
Anbefalet læsning
- Python Flask Tutorial - Introduktion til Flask For Beginners
- Flaskedesignmønstre og bedste fremgangsmåder til webapplikationer
- Flask API Tutorial med eksempel | Udvidelse af kolbe med API'er
- Standard Template Library (STL): En kort introduktion
- Hvad er testscenarie: Testscenariskabelon med eksempler
- Eksempel på testcase-skabelon med eksempler på testcase [Download]
- Eksempelskabelon til acceptrapport med eksempler
- Skabeloner i C ++ med eksempler