Flask
routing
Zoeken…
Basisroutes
Routes Flask kan worden gedefinieerd met de route
decorateur van de Flask toepassingsexemplaar:
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
De route
decorateur neemt een string die de URL aan te passen. Wanneer een aanvraag voor een URL die overeenkomt met deze string wordt ontvangen door de toepassing, wordt de gedecoreerde functie (ook wel een view-functie genoemd ) aangeroepen. Dus voor een route die we zouden hebben:
@app.route('/about')
def about():
return 'About page'
Het is belangrijk op te merken dat deze routes geen reguliere expressies zijn zoals in Django.
U kunt ook variabele regels definiëren om URL-segmentwaarden in variabelen te extraheren:
@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 bevindt de variabele regel zich in het laatste segment van de URL. Welke waarde in het laatste segment van de URL dan ook wordt doorgegeven aan de view-functie ( get_blog_post
) als de parameter post_id
. Dus een verzoek aan /blog/posts/42
zal het blogbericht met een ID van 42 ophalen (of proberen op te halen).
Het is ook gebruikelijk om URL's opnieuw te gebruiken. Misschien willen we bijvoorbeeld dat /blog/posts
een lijst met alle blogposts retourneren. We kunnen dus twee routes hebben voor dezelfde weergavefunctie:
@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
# get the post or list of posts
Merk op dat we ook de standaardwaarde None
post_id
voor de post_id
in get_blog_post
. Wanneer de eerste route overeenkomt, is er geen waarde om door te geven aan de weergavefunctie.
Merk ook op dat het type variabele regel standaard een string is. U kunt echter verschillende typen opgeven, zoals int
en float
door de variabele voor te voegen:
@app.route('/blog/post/<int:post_id>')
De ingebouwde URL-converters van Flask zijn:
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
Als we proberen de URL /blog/post/foo
met een waarde in het laatste URL-segment die niet kan worden geconverteerd naar een geheel getal, zou de toepassing een 404-fout retourneren. Dit is de juiste actie omdat er geen regel is met /blog/post
en een string in het laatste segment.
Ten slotte kunnen routes worden geconfigureerd om ook HTTP-methoden te accepteren. De route
decorateur neemt een methods
keyword argument dat is een lijst van tekenreeks die het aanvaardbaar HTTP-methoden voor deze route. Zoals je misschien al hebt aangenomen, is de standaardwaarde alleen GET
. Als we een formulier hadden om een nieuw blogbericht toe te voegen en de HTML voor het GET
verzoek wilden retourneren en de formuliergegevens voor het POST
verzoek wilden parseren, zou de route er ongeveer zo uitzien:
@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
De request
is te vinden in het flask
. Houd er rekening mee dat bij het gebruik van het methods
trefwoordargument, we expliciet moeten zijn over de te accepteren HTTP-methoden. Als we alleen POST
hadden vermeld, zou de route niet langer reageren op GET
verzoeken en een 405-fout retourneren.
Catch-all route
Het kan handig zijn om één allesomvattend beeld te hebben waarin u op basis van het pad zelf met complexe logica omgaat. In dit voorbeeld worden twee regels: De eerste regel specifiek vangsten /
en de tweede regel vangsten arbitrair paden met de ingebouwde path
converter. De path
overeen met elke string (inclusief schuine strepen). Zie Flask Variable-Rules
@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 en HTTP-methoden
Standaard reageren routes alleen op GET
aanvragen. U kunt dit gedrag veranderen door het leveren van de methods
argument voor de route()
decorateur.
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
U kunt ook verschillende functies toewijzen aan hetzelfde eindpunt op basis van de gebruikte HTTP-methode.
@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'