Flask
Routing
Ricerca…
Percorsi di base
Le route
in Flask possono essere definite utilizzando il route
decorator dell'istanza dell'applicazione Flask:
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
Il decoratore del route
prende una stringa che corrisponde all'URL corrispondente. Quando una richiesta per un URL che corrisponde a questa stringa viene ricevuta dall'applicazione, verrà richiamata la funzione decorata (chiamata anche funzione di visualizzazione ). Quindi per un percorso di circa avremmo:
@app.route('/about')
def about():
return 'About page'
È importante notare che questi percorsi non sono espressioni regolari come in Django.
È anche possibile definire regole variabili per estrarre i valori del segmento URL in variabili:
@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
Qui la regola della variabile si trova nell'ultimo segmento dell'URL. Qualsiasi valore si trovi nell'ultimo segmento dell'URL verrà passato alla funzione di visualizzazione ( get_blog_post
) come parametro post_id
. Quindi una richiesta a /blog/posts/42
recupererà (o tenterà di recuperare) il post del blog con un id di 42.
È anche comune riutilizzare gli URL. Ad esempio, forse vogliamo che /blog/posts
restituiscano un elenco di tutti i post del blog. Quindi potremmo avere due percorsi per la stessa funzione di visualizzazione:
@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
# get the post or list of posts
Nota qui che dobbiamo anche fornire il valore predefinito di None
per post_id
in get_blog_post
. Quando viene abbinato il primo percorso, non ci sarà alcun valore da passare alla funzione di visualizzazione.
Si noti inoltre che, per impostazione predefinita, il tipo di una regola variabile è una stringa. Tuttavia, puoi specificare diversi tipi come int
e float
aggiungendo il prefisso alla variabile:
@app.route('/blog/post/<int:post_id>')
I convertitori di URL incorporati di Flask sono:
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
Se dovessimo provare a visitare l'URL /blog/post/foo
con un valore nell'ultimo segmento di URL che non può essere convertito in un numero intero, l'applicazione restituirebbe un errore 404. Questa è l'azione corretta perché non esiste una regola con /blog/post
e una stringa nell'ultimo segmento.
Infine, i percorsi possono essere configurati per accettare anche i metodi HTTP. Il decoratore del route
accetta un argomento parola chiave methods
che è un elenco di stringhe che rappresentano i metodi HTTP accettabili per questa rotta. Come si può presumere, il valore predefinito è solo GET
. Se avessimo un modulo per aggiungere un nuovo post del blog e volessimo restituire l'HTML per la richiesta GET
e analizzare i dati del modulo per la richiesta POST
, il percorso sarebbe simile al seguente:
@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
La request
si trova nel pacchetto del flask
. Si noti che quando si utilizzano i methods
ragionamento parola chiave, dobbiamo essere espliciti sui metodi HTTP ad accettare. Se avessimo elencato solo POST
, il percorso non rispondeva più alle richieste GET
e restituiva un errore 405.
Percorso tutto compreso
Può essere utile avere una vista generale in cui si gestisce la logica complessa in base al percorso. Questo esempio utilizza due regole: La prima regola cattura specifico /
e la seconda regola cattura percorsi arbitrari con incorporata path
convertitore. Il convertitore di path
corrisponde a qualsiasi stringa (comprese le barre) Vedi Regole variabili flask
@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 e metodi HTTP
Per impostazione predefinita, le rotte rispondono solo alle richieste GET
. È possibile modificare questo comportamento fornendo l'argomento methods
al decoratore route()
.
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
È anche possibile mappare diverse funzioni allo stesso endpoint in base al metodo HTTP utilizzato.
@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'