flask template form
Denne opplæringen forklarer hva som er flaskemal, skjema, visning, respons og omdirigering med praktiske eksempler:
Generelt brukes mal i programmering, for å gjenbruke en del tekst med forskjellige data. Når det gjelder nettutvikling, bruker designere maler for å vise data i en form som er lesbar og attraktiv for menneskelige lesere.
En malutforming innebærer vanligvis bruk av et språk på grunn av kompleksiteten som menneskelig samhandling medfører.
=> Ta en titt på Flask Beginners Guide her
Hva du vil lære:
Introduksjon
Flask bruker en malmotor kalt Jinja2, som viser oppførselen til en applikasjon basert på brukerens interaksjonsnivå. En Jinja-mal bruker variabler, uttrykk og koder.
Variabler og uttrykk erstattes med verdier i løpetid før gjengivelse av sider i nettleseren. Jinja-koder hjelper til med å skrive logikk og kontrollere uttalelser i Flask-malen.
Flask View
Begrepet Flask-visning er avledet fra et utbredt mønster for webapplikasjon, kalt Model-View-Controller. A View er et av de tre sammenkoblede elementene i dette paradigmet, der det omhandler applikasjonslogikk. Visningen tar seg av presentasjonen av informasjon til brukeren.
I vår forrige veiledning designet vi en visning ved å underklasse BaseView-klassen til Flask-Appbuilder. I den påfølgende delen av denne opplæringen vil vi utvide vårt siste eksempel og presentere måter som Views kan tilpasses på.
Kolbemal
La oss begynne og skrive vår første mal. Opprett en fil som heter hello.html under malkatalogen.
Skriv følgende kode i den filen og lagre den.
Hello World!, from Software Testing Help.
{% for item in greetings %} {% if 'Morning' in item %} {{item}}
{% else %} {{item}}
{% endif %} {% endfor %}
Mal for løkke
I den ovennevnte flaskemalen har vi brukt en for-løkke til å gjenta elementene i listen. I kontrolleren eller behandleren vår sendte vi en liste med verdier av hilsener til malen. Inne i malen får vi tilgang til hvert element ved hjelp av {{item}} syntaksen.
Mal hvis blokk
Noter dessuten bruken av en if-setning. Her tester vi varen for morgen og gjør den fet og kursiv.
La oss nå gå videre for å lære mer om begrepene Flask Forms.
Flaskeskjemaer
En av de mest avgjørende aspektene ved malering er å ta input fra brukerne og skrive backendlogikk basert på den innspillingen. La oss lage et skjema.
Vi bruker Flask-Appbuilder SimpleFormView for å gjengi skjemaet vårt. La oss imidlertid opprette et skjema først. I tillegg til opprettelsen av et skjema, må vi bruke kolben fab create-admin-kommando for å opprette en adminbruker.
Bruk derfor kommandoen før du starter utviklingsserveren, slik at visningene og skjemaene som er opprettet senere, kan valideres med en pålogget bruker. Vi logger på med administratorbrukeren og fortsetter å validere at opprettede visninger er synlige under menyen som vist på skjermbildene.
Opprett administrator
Bruk kommandoen nedenfor for å opprette en administratorbruker.
kolbe fab create-admin
Logg inn med administratorlegitimasjonen
- Klikk på Logg inn etter at du har navigert til http: // localhost: 8080.
- Logg på med administratorlegitimasjonen, opprettet i forrige seksjon.
- Klikk på kategorien Mine skjemaer for å få tilgang til visningene dine.
Merk: Du vil kunne utføre det siste trinnet bare etter at du har lagt til visningene i standardmenyen som vises i navlinjen.
La oss gå videre og lage noen formbaserte visninger.
Opprett en fil som heter forms.py under appkatalogen, og skriv følgende kode inn 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 laget et skjema basert på DynamicForm fra Flask-Appbuilder. Det er fire tekstfelt. Vi utvider hilseneksemplet vårt. Av de fire feltene er to obligatoriske og to er valgfrie fordi vi for de to første hilsenene har nevnt verdiene for validatorer.
La oss nå lage en visning for dette skjemaet. Skriv disse følgende kodelinjene i filvisningen.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'))
Etter vårt syn ovenfor har vi to metoder kalt form_get og form_post for å fylle ut standardverdiene i feltene i skjemaene og lese de angitte verdiene når henholdsvis skjemaet er sendt fra nettleseren.
GreetingsView viser skjemaet, som vist på bildet nedenfor.
Vi bruker også et Flask-sesjonsobjekt for å lagre feltverdiene i form_post slik at vi kan få tilgang til det samme i den tilsvarende nye visningen som vi skal skrive.
La oss nå endre HelloWorld-klassen og legge til en annen metode for å vise hilsenene. Vi vil kalle det hei_hilsener2.
class HelloWorld(BaseView): ## other methods @expose('/greetings2') def hello_greetings2(self): greetings = session('greetings') return render_template('hello.html', greetings=greetings)
I denne visningen leser vi verdiene fra øktobjektet og bruker Flask render-malen for å vise disse verdiene i den HTML-filen som brukeren vender mot. Legg merke til at hello_greetings2 er en alternativ måte å oppnå samme funksjonalitet som hello_greetings.
Den eneste forskjellen er at ved å bruke hello_greetings2 viser vi verdiene som er oppgitt av brukeren, og i hello_greetings tok vi ingen input fra brukeren og hardkodet dem mens vi skrev utsikten kartlagt til den respektive ruten.
Flaskesvar
Det er ganske sjelden at du finner eksplisitt bruk av Flask-respons i koden. Response class in Flask er bare en underklasse av Response-klassen fra Werkzuegs Response-klasse, som igjen underklasser sin ResponseBase-klasse.
Flask Response-objektet dannes internt av Flask når vi kaller en returuttalelse eller en metode som render_template.
Videre kan vi tilpasse responskoden og innholdstypen hvis nødvendig, som en del av returuttalelsen i våre synspunkter, som vist i den modifiserte HelloWorld-visningen 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 bruk av Flask's Response-klasse kan dekkes i en brukstilfelle når vi streamer innholdet i stedet for å returnere hele innholdet på en gang på grunn av begrensningene i filstørrelse og nettverksbåndbredde.
Vi har vist nedenfor et eksempel på streaming av innholdet 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')
Kolbeomdirigering
Det er ikke alltid mulig for et program å forhåndsdefinere svaret basert på de forskjellige forespørslene fra klienten.
Vi bruker Flask Redirect, i scenarier, der det er mulig å servere innholdet som kan oppfylles av de andre visningene eller stedene som svar på en forespørsel. Vi bruker Flask Redirect sammen med avbryte med standard HTTP-returkoder.
For eksempel, i koden nedenfor har vi brukt Redirect med HTTP-kode 301, og avbrutt 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
Videre sjekker du inn GreetingsView hvor vi har brukt Flask-redirect og url_for for å omdirigere en forespørsel internt til en annen visning ved å lagre hilsenverdiene i øktobjektet. Flask omdirigering returnerer alltid et svarobjekt, med standard- eller gitt statuskode til et annet sted i applikasjonen.
Kolbe Debugtoolbar
Vi introduserte allerede Flasks interaktive feilsøkingsprogram i vår siste veiledning. I denne opplæringen tar vi ett skritt til for å gjøre feilsøking av Flask-applikasjonen enklere. Når den er installert, vises Flask Debug-verktøylinjen som et overlegg over Flask-applikasjonen.
Installer verktøylinjen Flask Debug.
pip install flask-debugtoolbar
For å aktivere debugtoolbar, åpne __init__.py-filen i prosjektet vårt og endre koden ved å legge til følgende kodelinjer.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Vær oppmerksom på at Flask feilsøkingsverktøylinjen bare er aktivert i feilsøkingsmodus. Når du er aktivert, når du laster inn applikasjonen på nytt, vil du observere to ting.
#1) Feilsøkingsverktøylinjen vises på høyre side av nettleseren. Klikk og utvid den for å se de forskjellige funksjonene fra verktøylinjen.
#to) Hver gang en ny POST-forespørsel sendes til applikasjonen, blir den avskjæret av verktøylinjen slik at vi kan inspisere variablene og de andre parametrene som gjelder feilsøking av applikasjonen.
Denne standardavskjæringen kan deaktiveres med konfigurasjonen nedenfor.
app.config('DEBUG_TB_INTERCEPT_REDIRECTS') = False
La oss nå skrive noen tester for å teste synspunktene våre for tilleggsfunksjonene vi har introdusert i eksempelprogrammet.
hvordan du setter opp en falsk e-post
Før du går videre med testingen, må du deaktivere feilsøking som vist nedenfor i __init__.py. Alternativt kan du kommentere linjen nedenfor.
app.debug = False
Testing av flaskeapplikasjonsvisninger
Vi må organisere testkoden for å gjøre den mer håndterbar. Opprett en fil som heter conftest.py i rotkatalogen, og flytt nedenstående linjer fra test_hello.py til denne filen.
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 lastes av pytest på kjøretid. Disse armaturene er tilgjengelige og deles med alle tester. Å definere en conftest.py i rotbanen til ethvert prosjekt betraktes som en god praksis fordi pytest kan gjenkjenne alle modulene i prosjektet uten å spesifisere en eksplisitt PYTHONPATH.
Legg til en test til test_hello-filen. Et eksempel på en test er gitt nedenfor. Vi kaller klientobjektets get-metode og hevder den forventede verdien i responsdata lagret i resp. Data.
På samme måte kan du skrive flere tester som peker på forskjellige visninger. Vi skal skrive flere tester i de påfølgende opplæringene.
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
Kjør testene ved å bruke kommandoen nedenfor fra prosjektets rotkatalog.
pytest -v
Testkjøring produserer testresultatene i konsollen, som vist nedenfor:
Det er ingen feil ennå. La oss designe en test til, som nevnt 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 testen mislykkes ettersom vi ikke definerte noe meldingsattributt i HelloWorld-klassen i views.py-filen.
Når du har kjørt tester med pytest -v, vil resultatene som ligner på det nedenfor viste bildet igjen vises på konsollen.
Avsnittet nedenfor forklarer trinnene vi trenger å utføre når vi kjører testene på en CI / CD-plattform. Vi bruker Git Actions for det samme prosjektet.
CI / CD med Git Actions
Vi lagrer nå alle endringene i filene og oppretter en forpliktelse ved å gi meldingen til denne opplæringen. Etter å ha forpliktet oss til det lokale depotet, trekker vi endringer fra den eksterne opprinnelsen med –rebase-flagget for å se om det er noen konflikt med de nye endringene på fjernkontrollen. Vi baserer på nytt for å holde historien konsistent.
Bruk kommandoen nedenfor for å hente og slå sammen endringene fra den eksterne opprinnelsen. Foreta imidlertid endringene dine før du trekker endringene fra fjernkontrollen.
git pull origin master --rebase
Nå sjekk ut den lokale hovedgrenen og slå sammen med tutorial-2-grenen. Når sammenslåingen er vellykket, kan du publisere endringene til opprinnelsens master. Denne handlingen vil påkalle byggene på målplattformene. Vi tester denne koden på Python3.7 og Python 3.8 på Ubuntu siste gang.
Konklusjon
I denne opplæringen så vi hvordan maler fungerer i Flask-rammeverket. Vi skisserte trinnene for å lage og gjengi kolbamaler med brukerdefinerte verdier ved hjelp av variabler og uttrykk.
Vi så også eksempler på en forhåndsdefinert visning av BaseView av Flask Appbuilder-plugin. Denne visningen kan enkelt underklasseres av Flask-utviklere for å lage tilpassede visninger.
Konsepter som hittil er dekket, hjelper leserne med å raskt lage statiske og dynamiske nettsteder ved hjelp av Flask uten en database-backend. Vi vil forklare hvordan du leser og skriver data fra og til databasene med ModelView i neste opplæring når vi går gjennom konseptet med å bruke databaser med Flask.
=> Les gjennom Easy Flask Training Series
Anbefalt lesing
- Python Flask Tutorial - Introduction to Flask For Beginners
- Flaskedesignmønstre og beste fremgangsmåter for webapplikasjoner
- Flask API-veiledning med eksempel | Utvide kolbe med API-er
- Standard malbibliotek (STL): En kort introduksjon
- Hva er testscenario: testscenariomal med eksempler
- Eksempel på testsaksmal med eksempler på prøvesaker (Last ned)
- Eksempelmal for akseptrapport med eksempler
- Maler i C ++ med eksempler