Flask
Routing
Suche…
Grundrouten
Routen in Flask können die definiert werden route
Dekorateur der Flask Anwendungsinstanz:
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
Die route
Dekorateur nimmt eine Zeichenfolge , die die URL übereinstimmen. Wenn eine Anfrage nach einer URL, die dieser Zeichenfolge entspricht, von der Anwendung empfangen wird, wird die dekorierte Funktion (auch Ansichtsfunktion genannt ) aufgerufen. Für eine Rundstrecke hätten wir also:
@app.route('/about')
def about():
return 'About page'
Es ist wichtig zu wissen, dass diese Routen keine regulären Ausdrücke sind wie in Django.
Sie können auch Variablenregeln definieren , um URL-Segmentwerte in Variablen zu extrahieren:
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id):
# look up the blog post with id post_id
# return some kind of HTML
Hier befindet sich die Variablenregel im letzten Segment der URL. Welcher Wert im letzten Segment der URL enthalten ist, wird als post_id
Parameter an die View-Funktion ( get_blog_post
) post_id
. Eine Anfrage an /blog/posts/42
ruft den Blogbeitrag mit der ID /blog/posts/42
ab (oder versucht, ihn abzurufen).
Es ist auch üblich, URLs wiederzuverwenden. Zum Beispiel möchten wir vielleicht /blog/posts
eine Liste aller Blogbeiträge zurückgeben. Wir könnten also zwei Routen für dieselbe Ansichtsfunktion haben:
@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
# get the post or list of posts
Beachten Sie hierbei, dass wir auch den Standardwert None
für die post_id
in get_blog_post
post_id
get_blog_post
. Wenn die erste Route abgeglichen wird, gibt es keinen Wert, der an die Ansichtsfunktion übergeben werden kann.
Beachten Sie außerdem, dass der Typ einer Variablenregel standardmäßig eine Zeichenfolge ist. Sie können jedoch verschiedene Typen angeben, z. B. int
und float
indem Sie die Variable voranstellen:
@app.route('/blog/post/<int:post_id>')
Die integrierten URL-Konverter von Flask sind:
string | Accepts any text without a slash (the default).
int | Accepts integers.
float | Like int but for floating point values.
path | Like string but accepts slashes.
any | Matches one of the items provided
uuid | Accepts UUID strings
Wenn wir versuchen, die URL /blog/post/foo
mit einem Wert im letzten URL-Segment aufzurufen, der nicht in eine Ganzzahl konvertiert werden kann, gibt die Anwendung einen 404-Fehler zurück. Dies ist die richtige Aktion, da es im letzten Segment keine Regel mit /blog/post
und keine Zeichenfolge gibt.
Schließlich können Routen so konfiguriert werden, dass auch HTTP-Methoden akzeptiert werden. Die route
decorator nimmt ein methods
Schlüsselwort Argument , das eine Liste der Zeichenfolge ist , die die HTTP akzeptablen Methoden für diese Route. Wie Sie vielleicht angenommen haben, ist der Standard nur GET
. Wenn wir ein Formular zum Hinzufügen eines neuen Blogbeitrags hätten und den HTML-Code für die GET
Anforderung zurückgeben und die Formulardaten für die POST
Anforderung analysieren möchten, würde die Route etwa so aussehen:
@app.route('/blog/new', methods=['GET', 'POST'])
def new_post():
if request.method == 'GET':
# return the form
elif request.method == 'POST':
# get the data from the form values
Die request
befindet sich im flask
. Beachten Sie, dass wir bei der Verwendung des methods
die zu akzeptierenden HTTP-Methoden explizit angeben müssen. Wenn wir nur POST
aufgelistet hätten, würde die Route nicht mehr auf GET
Anforderungen antworten und einen Fehler 405 zurückgeben.
Catch-All-Route
Es kann nützlich sein, über eine einzige Catch-Ansicht zu verfügen, in der Sie komplexe Logik basierend auf dem Pfad selbst behandeln. In diesem Beispiel werden zwei Regeln: Die erste Regel speziell fängt /
und die zweite Regel fängt beliebige Pfade mit dem Einbau- path
- Wandler. Der path
entspricht einer beliebigen Zeichenfolge (einschließlich Schrägstrichen). Siehe Variablenregeln für Flaschen
@app.route('/', defaults={'u_path': ''})
@app.route('/<path:u_path>')
def catch_all(u_path):
print(repr(u_path))
...
c = app.test_client()
c.get('/') # u_path = ''
c.get('/hello') # u_path = 'hello'
c.get('/hello/stack/overflow/') # u_path = 'hello/stack/overflow/'
Routing- und HTTP-Methoden
Standardmäßig antworten Routen nur auf GET
Anforderungen. Sie können dieses Verhalten ändern, indem Sie dem route()
Dekorator das methods
.
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
Sie können basierend auf der verwendeten HTTP-Methode auch verschiedene Funktionen demselben Endpunkt zuordnen.
@app.route('/endpoint', methods=['GET'])
def get_endpoint():
#respond to GET requests for '/endpoint'
@app.route('/endpoint', methods=['POST', 'PUT', 'DELETE'])
def post_or_put():
#respond to POST, PUT, or DELETE requests for '/endpoint'