Suche…


Grundrouten

Routen in Flask können die definiert werden route Dekorateur der Flask Anwendungsinstanz:

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello Flask'

Die route Dekorateur nimmt eine Zeichenfolge , die die URL übereinstimmen. Wenn eine Anfrage nach einer URL, die dieser Zeichenfolge entspricht, von der Anwendung empfangen wird, wird die dekorierte Funktion (auch Ansichtsfunktion genannt ) aufgerufen. Für eine Rundstrecke hätten wir also:

@app.route('/about')
def about():
    return 'About page'

Es ist wichtig zu wissen, dass diese Routen keine regulären Ausdrücke sind wie in Django.

Sie können auch Variablenregeln definieren , um URL-Segmentwerte in Variablen zu extrahieren:

@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 befindet sich die Variablenregel im letzten Segment der URL. Welcher Wert im letzten Segment der URL enthalten ist, wird als post_id Parameter an die View-Funktion ( get_blog_post ) post_id . Eine Anfrage an /blog/posts/42 ruft den Blogbeitrag mit der ID /blog/posts/42 ab (oder versucht, ihn abzurufen).

Es ist auch üblich, URLs wiederzuverwenden. Zum Beispiel möchten wir vielleicht /blog/posts eine Liste aller Blogbeiträge zurückgeben. Wir könnten also zwei Routen für dieselbe Ansichtsfunktion haben:

@app.route('/blog/posts')
@app.route('/blog/posts/<post_id>')
def get_blog_post(post_id=None):
    # get the post or list of posts

Beachten Sie hierbei, dass wir auch den Standardwert None für die post_id in get_blog_post post_id get_blog_post . Wenn die erste Route abgeglichen wird, gibt es keinen Wert, der an die Ansichtsfunktion übergeben werden kann.

Beachten Sie außerdem, dass der Typ einer Variablenregel standardmäßig eine Zeichenfolge ist. Sie können jedoch verschiedene Typen angeben, z. B. int und float indem Sie die Variable voranstellen:

@app.route('/blog/post/<int:post_id>')

Die integrierten URL-Konverter von Flask sind:

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

Wenn wir versuchen, die URL /blog/post/foo mit einem Wert im letzten URL-Segment aufzurufen, der nicht in eine Ganzzahl konvertiert werden kann, gibt die Anwendung einen 404-Fehler zurück. Dies ist die richtige Aktion, da es im letzten Segment keine Regel mit /blog/post und keine Zeichenfolge gibt.

Schließlich können Routen so konfiguriert werden, dass auch HTTP-Methoden akzeptiert werden. Die route decorator nimmt ein methods Schlüsselwort Argument , das eine Liste der Zeichenfolge ist , die die HTTP akzeptablen Methoden für diese Route. Wie Sie vielleicht angenommen haben, ist der Standard nur GET . Wenn wir ein Formular zum Hinzufügen eines neuen Blogbeitrags hätten und den HTML-Code für die GET Anforderung zurückgeben und die Formulardaten für die POST Anforderung analysieren möchten, würde die Route etwa so aussehen:

@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

Die request befindet sich im flask . Beachten Sie, dass wir bei der Verwendung des methods die zu akzeptierenden HTTP-Methoden explizit angeben müssen. Wenn wir nur POST aufgelistet hätten, würde die Route nicht mehr auf GET Anforderungen antworten und einen Fehler 405 zurückgeben.

Catch-All-Route

Es kann nützlich sein, über eine einzige Catch-Ansicht zu verfügen, in der Sie komplexe Logik basierend auf dem Pfad selbst behandeln. In diesem Beispiel werden zwei Regeln: Die erste Regel speziell fängt / und die zweite Regel fängt beliebige Pfade mit dem Einbau- path - Wandler. Der path entspricht einer beliebigen Zeichenfolge (einschließlich Schrägstrichen). Siehe Variablenregeln für Flaschen

@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- und HTTP-Methoden

Standardmäßig antworten Routen nur auf GET Anforderungen. Sie können dieses Verhalten ändern, indem Sie dem route() Dekorator das methods .

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

Sie können basierend auf der verwendeten HTTP-Methode auch verschiedene Funktionen demselben Endpunkt zuordnen.

@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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow