flask template form
Αυτό το σεμινάριο εξηγεί τι είναι το Flask Template, Form, View, Response και Redirect Με πρακτικά παραδείγματα:
Γενικά, το Templating χρησιμοποιείται στον Προγραμματισμό, για την επαναχρησιμοποίηση τμήματος κειμένου με διαφορετικά δεδομένα. Όσον αφορά την ανάπτυξη Ιστού, οι Σχεδιαστές χρησιμοποιούν πρότυπα για την εμφάνιση δεδομένων σε μορφή που είναι αναγνώσιμη και ελκυστική για τους αναγνώστες του ανθρώπου.
Ο σχεδιασμός προτύπων περιλαμβάνει γενικά τη χρήση μιας γλώσσας λόγω των περιπλοκών που δημιουργεί η ανθρώπινη αλληλεπίδραση.
=> Ρίξτε μια ματιά στον οδηγό για τους αρχάριους της φιάλης εδώ
Τι θα μάθετε:
Εισαγωγή
Το Flask χρησιμοποιεί μια μηχανή templating που ονομάζεται Jinja2, η οποία εμφανίζει τη συμπεριφορά μιας εφαρμογής με βάση το επίπεδο αλληλεπίδρασης του χρήστη. Ένα πρότυπο Jinja χρησιμοποιεί μεταβλητές, εκφράσεις και ετικέτες.
Οι μεταβλητές και οι εκφράσεις αντικαθίστανται με τιμές κατά το χρόνο εκτέλεσης πριν από την απόδοση της σελίδας στο πρόγραμμα περιήγησης. Οι ετικέτες Jinja βοηθούν στη σύνταξη λογικής και ελέγχουν τις δηλώσεις στο πρότυπο Flask.
Προβολή φιάλης
Η έννοια της προβολής Flask προέρχεται από ένα διαδεδομένο σχέδιο σχεδίασης εφαρμογών ιστού που ονομάζεται 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, έχουμε χρησιμοποιήσει ένα για βρόχο για να επαναλάβουμε τα στοιχεία της λίστας. Στον ελεγκτή ή τον χειριστή μας, περάσαμε μια λίστα με τιμές χαιρετισμών στο πρότυπο. Μέσα στο πρότυπο, έχουμε πρόσβαση σε κάθε στοιχείο χρησιμοποιώντας τη σύνταξη {{item}}.
Πρότυπο εάν μπλοκ
Εκτός αυτού, σημειώστε τη χρήση μιας δήλωσης if. Εδώ, δοκιμάζουμε το στοιχείο για το πρωί και το κάνουμε έντονο και πλάγιο.
Τώρα ας προχωρήσουμε για να μάθουμε περισσότερα σχετικά με τις έννοιες των Flask Forms.
Έντυπα φιάλης
Μία από τις πιο κρίσιμες πτυχές του templating είναι να λαμβάνετε εισόδους από τους χρήστες και να γράφετε λογική backend βάσει αυτής της εισόδου. Ας δημιουργήσουμε μια φόρμα.
Χρησιμοποιούμε το Flask-Appbuilder SimpleFormView για να δώσουμε τη φόρμα μας. Ωστόσο, ας δημιουργήσουμε πρώτα μια φόρμα. Εκτός από τη δημιουργία μιας φόρμας, πρέπει να χρησιμοποιήσουμε την εντολή flask fab create-admin για να δημιουργήσουμε έναν διαχειριστή.
Επομένως, χρησιμοποιήστε την εντολή πριν ξεκινήσετε τον διακομιστή ανάπτυξης, έτσι ώστε οι προβολές και οι φόρμες που δημιουργήθηκαν στη συνέχεια να μπορούν να επικυρωθούν με έναν συνδεδεμένο χρήστη. Συνδεόμαστε με τον χρήστη διαχειριστή και συνεχίζουμε να επιβεβαιώνουμε ότι οι δημιουργημένες προβολές είναι ορατές κάτω από το μενού, όπως φαίνεται στα στιγμιότυπα οθόνης.
Δημιουργία διαχειριστή
Χρησιμοποιήστε την παρακάτω εντολή για να δημιουργήσετε έναν χρήστη διαχειριστή.
flask 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)
Σε αυτήν την προβολή, διαβάζουμε τις τιμές από το αντικείμενο περιόδου λειτουργίας και χρησιμοποιούμε το πρότυπο απόδοσης φιάλης για να εμφανίσουμε αυτές τις τιμές στο HTML που βλέπει ο χρήστης. Σημειώστε ότι το hello_greetings2 είναι ένας εναλλακτικός τρόπος για να επιτύχετε την ίδια λειτουργικότητα παρόμοια με αυτή του hello_greetings.
Η μόνη διαφορά είναι ότι χρησιμοποιώντας το hello_greetings2, δείχνουμε τις τιμές που εισάγει ο Χρήστης, και στο hello_greetings δεν λάβαμε καμία είσοδο από τον Χρήστη και τους κωδικοποιήσαμε κατά την εγγραφή της προβολής που αντιστοιχίστηκε στην αντίστοιχη διαδρομή.
Απόκριση φιάλης
Είναι πολύ σπάνιο να βρείτε τη ρητή χρήση της απόκρισης Flask στον κώδικα. Η τάξη απόκρισης στο Flask είναι απλώς μια υποκατηγορία της κλάσης απόκρισης από την τάξη απόκρισης του Werkzueg, η οποία με τη σειρά της ταξινομεί την τάξη 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 μπορεί να καλυφθεί σε περίπτωση χρήσης όταν μεταδίδουμε το περιεχόμενο αντί να επιστρέφουμε το πλήρες περιεχόμενο ταυτόχρονα λόγω των περιορισμών του μεγέθους του αρχείου και του εύρους ζώνης δικτύου.
Παρακάτω έχουμε δείξει ένα παράδειγμα ροής του περιεχομένου από ένα μεγάλο 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 Code 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 για να ανακατευθύνουμε ένα αίτημα εσωτερικά σε διαφορετική προβολή αποθηκεύοντας τις τιμές των χαιρετισμών στο αντικείμενο συνεδρίας. Η ανακατεύθυνση της φιάλης επιστρέφει πάντα ένα αντικείμενο απόκρισης, με τον προεπιλεγμένο ή τον κωδικό κατάστασης σε άλλη τοποθεσία στην εφαρμογή.
Flask Debugtoolbar
Έχουμε ήδη παρουσιάσει το διαδραστικό πρόγραμμα εντοπισμού σφαλμάτων του Flask στο τελευταίο μας σεμινάριο. Σε αυτό το σεμινάριο, κάνουμε ένα ακόμη βήμα για να διευκολύνουμε τον εντοπισμό σφαλμάτων της εφαρμογής Flask. Μόλις εγκατασταθεί, η γραμμή εργαλείων Flask Debug εμφανίζεται ως επικάλυψη πάνω από την εφαρμογή Flask.
Εγκαταστήστε τη γραμμή εργαλείων Flask Debug.
pip install flask-debugtoolbar
Για να ενεργοποιήσετε τη γραμμή εντοπισμού σφαλμάτων, ανοίξτε το αρχείο __init__.py στο έργο μας και τροποποιήστε τον κώδικα προσθέτοντας τις ακόλουθες γραμμές κώδικα.
from flask_debugtoolbar import DebugToolbarExtension app.debug = True toolbar = DebugToolbarExtension(app)
Λάβετε υπόψη ότι η γραμμή εργαλείων εντοπισμού σφαλμάτων Flask είναι ενεργοποιημένη μόνο σε κατάσταση εντοπισμού σφαλμάτων. Μόλις ενεργοποιηθεί, όταν φορτώνετε ξανά την εφαρμογή σας, θα παρατηρήσετε δύο πράγματα.
# 1) Η Γραμμή εργαλείων εντοπισμού σφαλμάτων εμφανίζεται στη δεξιά πλευρά του προγράμματος περιήγησης. Κάντε κλικ και αναπτύξτε το για να δείτε τις διάφορες δυνατότητες που παρέχονται από τη γραμμή εργαλείων.

#δύο) Κάθε φορά που αποστέλλεται ένα νέο αίτημα POST στην εφαρμογή, παρακωλύεται από τη γραμμή εργαλείων έτσι ώστε να μπορούμε να ελέγξουμε τις μεταβλητές και τις άλλες παραμέτρους που σχετίζονται με τον εντοπισμό σφαλμάτων της εφαρμογής.

Αυτή η προεπιλεγμένη αναχαίτιση μπορεί να απενεργοποιηθεί με την παρακάτω διαμόρφωση.
app.config('DEBUG_TB_INTERCEPT_REDIRECTS') = False

Τώρα ας γράψουμε μερικές δοκιμές για να δοκιμάσουμε τις απόψεις μας για τις πρόσθετες δυνατότητες που έχουμε εισαγάγει στην εφαρμογή δείγματος.
χρησιμοποιώντας το ipad για σημείο πώλησης
Πριν προχωρήσετε στη δοκιμή, απενεργοποιήστε τον εντοπισμό σφαλμάτων όπως φαίνεται παρακάτω στο __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. Ένα παράδειγμα δοκιμής δίνεται παρακάτω. Καλούμε τη μέθοδο λήψης του αντικειμένου πελάτη και επιβεβαιώνουμε την αναμενόμενη τιμή σε δεδομένα απόκρισης που είναι αποθηκευμένα στα 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 Actions για το ίδιο έργο.
CI / CD με Git Actions
Αποθηκεύουμε τώρα όλες τις αλλαγές στα αρχεία και δημιουργούμε μια δέσμευση δίνοντας το μήνυμα για αυτό το σεμινάριο. Αφού ολοκληρώσουμε το τοπικό αποθετήριο, τραβάμε αλλαγές από την απομακρυσμένη προέλευση με τη σημαία –rebase για να δούμε αν υπάρχουν διενέξεις με τις νέες αλλαγές στο τηλεχειριστήριο. Ανανεώνουμε για να διατηρήσουμε την ιστορία συνεπή.
Χρησιμοποιήστε την παρακάτω εντολή για να τραβήξετε και να συγχωνεύσετε τις αλλαγές από την απομακρυσμένη προέλευση. Ωστόσο, πραγματοποιήστε τις αλλαγές σας προτού τραβήξετε τις αλλαγές από το τηλεχειριστήριο.
git pull origin master --rebase
Τώρα ελέγξτε τον τοπικό κύριο κλάδο και συγχωνεύστε με τον κλάδο tutorial-2. Όταν η συγχώνευση είναι επιτυχής, δημοσιεύστε αυτές τις αλλαγές στον κύριο προέλευσης. Αυτή η ενέργεια θα επικαλεστεί τις κατασκευές σε πλατφόρμες στόχους. Δοκιμάζουμε αυτόν τον κώδικα στο Python3.7 και το Python 3.8 στο Ubuntu το αργότερο.
συμπέρασμα
Σε αυτό το σεμινάριο, είδαμε πώς λειτουργούν τα πρότυπα στο πλαίσιο της Φιάλης. Περιγράψαμε τα βήματα δημιουργίας και απόδοσης προτύπων φιάλης με καθορισμένες από τον χρήστη τιμές χρησιμοποιώντας μεταβλητές και εκφράσεις.
Είδαμε επίσης παραδείγματα προκαθορισμένης προβολής BaseView της προσθήκης Flask Appbuilder. Αυτή η προβολή μπορεί να υποκατηγορηθεί εύκολα από τους προγραμματιστές της Flask για τη δημιουργία προσαρμοσμένων προβολών.
Οι έννοιες που καλύπτονται μέχρι στιγμής βοηθούν τους αναγνώστες να δημιουργήσουν γρήγορα στατικούς και δυναμικούς ιστότοπους χρησιμοποιώντας το Flask χωρίς backend βάσης δεδομένων. Θα εξηγήσουμε πώς να διαβάζετε και να γράφετε δεδομένα από και προς τις βάσεις δεδομένων με το ModelView στο επόμενο σεμινάριο όταν εξετάζουμε την έννοια της χρήσης βάσεων δεδομένων με το Flask.
=> Διαβάστε τη σειρά προπόνησης Easy Flask
Συνιστώμενη ανάγνωση
- Εκμάθηση Python Flask - Εισαγωγή στη φιάλη για αρχάριους
- Σχέδια φιάλης και βέλτιστες πρακτικές για εφαρμογές Ιστού
- Flask API Tutorial με παράδειγμα | Επέκταση φιάλης με API
- Τυπική βιβλιοθήκη προτύπων (STL): Μια σύντομη εισαγωγή
- Τι είναι το σενάριο δοκιμής: Πρότυπο σεναρίου δοκιμής με παραδείγματα
- Δείγμα προτύπου υπόθεσης δοκιμής με παραδείγματα δοκιμαστικής θήκης (Λήψη)
- Δείγμα προτύπου για αναφορά δοκιμής αποδοχής με παραδείγματα
- Πρότυπα σε C ++ με παραδείγματα