Flask
routing
Sök…
Grundläggande rutter
Rutter i Flask kan definieras med hjälp av route
dekoratör av Flask programinstansen:
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello Flask'
Den route
dekoratör tar en sträng som är URL att matcha. När en begäran om en URL som matchar den här strängen tas emot av applikationen kommer den inredda funktionen (även kallad en visningsfunktion ) att åberopas. Så för en ungefärlig rutt skulle vi ha:
@app.route('/about')
def about():
return 'About page'
Det är viktigt att notera att dessa rutter inte är vanliga uttryck som i Django.
Du kan också definiera variabla regler för att extrahera värden för URL-segment i variabler:
@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
Här är variabelregeln i det sista segmentet av URL: n. Oavsett värde i det sista segmentet av URL kommer att överföras till visningsfunktionen ( get_blog_post
) som post_id
parametern. Så en begäran till /blog/posts/42
kommer att hämta (eller försöka hämta) blogginlägget med en id på 42.
Det är också vanligt att återanvända webbadresser. Till exempel kanske vi vill ha /blog/posts
returnera en lista över alla blogginlägg. Så vi kan ha två rutter för samma visningsfunktion:
@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
# get the post or list of posts
Observera här att vi också måste ange standardvärdet för None
för post_id
i get_blog_post
. När den första rutten matchas kommer det inget värde att gå till visningsfunktionen.
Observera också att typen av variabelregel som standard är en sträng. Du kan emellertid ange flera olika typer som int
och float
genom att prefixa variabeln:
@app.route('/blog/post/<int:post_id>')
Flaskens inbyggda URL-omvandlare är:
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
Om vi försöker besöka URL /blog/post/foo
med ett värde i det sista URL-segmentet som inte kan konverteras till ett heltal, skulle applikationen returnera ett 404-fel. Detta är rätt åtgärd eftersom det inte finns en regel med /blog/post
och en sträng i det sista segmentet.
Slutligen kan rutter konfigureras för att acceptera HTTP-metoder också. Den route
dekoratör tar methods
sökords argument som är en lista över sträng som representerar acceptabla HTTP metoder för denna väg. Som du antagit är standard bara GET
. Om vi hade ett formulär för att lägga till ett nytt blogginlägg och ville returnera HTML för GET
begäran och analysera formulärdata för POST
begäran, skulle rutten se ut så här:
@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
request
finns i flask
. Observera att när vi använder methods
nyckelordargument måste vi vara tydliga om HTTP-metoderna för att acceptera. Om vi bara hade listat POST
, skulle rutten inte längre svara på GET
förfrågningar och returnera ett 405-fel.
Fånga alla rutter
Det kan vara användbart att ha en översiktsvy där du själv hanterar komplex logik baserat på sökvägen. I det här exemplet används två regler: Den första regeln fångar specifikt /
och den andra regeln fångar godtyckliga banor med den inbyggda path
. path
matchar vilken sträng som helst (inklusive snedstreck). Se Flaskvariabelregler
@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 och HTTP-metoder
Som standard svarar rutter bara på GET
förfrågningar. Du kan ändra detta beteende genom att förse methods
argument till route()
dekoratör.
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()
Du kan också kartlägga olika funktioner till samma slutpunkt baserat på den använda HTTP-metoden.
@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'