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'


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow