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'


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow