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'


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow