Flask-Routing

Routing ist eine der Kernfunktionen von Web-Frameworks; es bestimmt, welche URL von welcher Funktion verarbeitet wird.

Flask-Routing ist ein Mechanismus in Webanwendungen, der URLs Python-Funktionen zuordnet.

Flask-Routing ist ein Kernbestandteil der Flask-Anwendung und wird verwendet, um Anfragen für verschiedene URLs zu bearbeiten und die Anfragenbearbeitung an entsprechende View-Funktionen zu delegieren.

Das Folgende ist eine detaillierte Beschreibung des Flask-Routings, einschließlich Routendefinitionen, Parametern, Methoden und Regeln.


Grundlegendes Routing

Verwendung@app.route()Der Decorator bindet den URL-Pfad an die View-Funktion:

Beispiel

from flask import Flask

app = Flask(__name__)

# Den Stammpfad "/" binden
@app.route("/")
def index():
    return "Dies ist die Startseite"

# Den "/hello"-Pfad binden
@app.route("/hello")
def hello():
    return "Hallo, EXAMPLE!"

# Verschiedene Pfade entsprechen verschiedenen Funktionen
@app.route("/about")
def about():
    return "Über diese Seite"

Besuchen Siehttp://127.0.0.1:5000/hello, wenn Flask die Funktionhello()aufruft.

Besuchen Siehttp://127.0.0.1:5000/about, wenn Flask die Funktionabout()aufruft.


Variablenregeln

In echten Anwendungen enthalten URLs oft dynamische Teile, wie Benutzer-IDs, Artikeltitel usw.

Flask verwendet<variable_name>Die Syntax definiert dynamische Teile in der URL, und die entsprechenden Parameter werden automatisch an die View-Funktion übergeben.

String-Variable (Standardtyp)

Wenn kein Typ angegeben wird, ist die Variable standardmäßig eine Zeichenkette und stimmt mit allem außer einem Schrägstrich überein./Jedes Zeichen außer:

Beispiel

# <username> ist eine dynamische Variable; Flask übergibt ihren Wert als Schlüsselwortparameter an die View-Funktion
@app.route("/user/<username>")
def show_user(username):
    # Hinweis: Der Benutzername kann bösartige Skripte enthalten; in der Produktion ist Escaping erforderlich
    return f"<h1>User: {username}</h1>"

# Testbesuche:
# /user/example → Seite zeigt "User: example"
# /user/EXAMPLE → Seite zeigt "User: EXAMPLE"

Typkonverter

Flask bietet mehrere integrierte Konverter, durch die Syntaxangabe<type:variable_name>:

Konverter Beschreibung Beispiel-URL Match-Ergebnis
string Standardmäßig werden Texte akzeptiert, die kein / enthalten /user/example username = "example"
int Positive Ganzzahl /post/42 post_id = 42
float Positive Gleitkommazahl /price/19.99 price = 19.99
path Akzeptiert Zeichenketten, die / enthalten /file/a/b/c.txt filepath = "a/b/c.txt"
uuid UUID-Formatzeichenkette /item/550e8400-e29b-41d4-a716-446655440000 item_id = UUID-Zeichenkette

Beispiel

# int-Konverter: Nur Ziffern können übereinstimmen; /post/abc gibt 404 zurück
@app.route("/post/<int:post_id>")
def show_post(post_id):
    # post_id ist vom Typ int, nicht string
    return f"<h1>Artikel #{post_id}</h1>"

# path-Konverter: Kann Pfade abgleichen, die / enthalten
@app.route("/file/<path:filepath>")
def show_file(filepath):
    return f"<p>Dateipfad: {filepath}</p>"

# float-Konverter: Stimmt mit Gleitkommazahlen überein
@app.route("/price/<float:amount>")
def show_price(amount):
    return f"<p>Preis: ¥{amount}</p>"

# UUID-Konverter: Akzeptiert nur das Standard-UUID-Format
@app.route("/item/<uuid:item_id>")
def show_item(item_id):
    return f"<p>Product ID: {item_id}</p>"

Konverter führen nicht nur eine Typvalidierung durch, sondern konvertieren übereinstimmende Werte auch automatisch in entsprechende Python-Typen. Zum Beispiel<int:post_id>Was an die View-Funktion übergeben wird, istintstattstr。


Weiterleitungsverhalten bei abschließendem Schrägstrich

am Ende der URL/Es hat direkten Einfluss auf das Routen-Matching-Verhalten, und viele Anfänger sind davon verwirrt.

Beispiel

# Regel 1: Endet mit / — ähnlich wie ein Verzeichnis
# Zugriff auf /projects leitet automatisch mit 308 zu /projects/ weiter
@app.route("/projects/")
def projects():
    return "Projektliste-Seite"

# Regel 2: Endet nicht mit / — ähnlich einer Datei
# Zugriff auf /about/ liefert 404 Nicht gefunden
@app.route("/about")
def about():
    return "Über-uns-Seite"
Routendefinition Besuche /projects Besuche /projects/
@app.route("/projects/") 308-Weiterleitung zu /projects/ Normale Antwort
@app.route("/about") Normale Antwort 404 Nicht gefunden

Dieses Design hilft bei SEO: Es stellt sicher, dass derselbe Inhalt nur eine kanonische URL hat, und verhindert, dass Suchmaschinen dieselbe Seite zweimal indexieren.


URL-Erstellung — url_for

url_for()ist Flasks integrierte Funktion zur URL-Generierung, die anhand des Namens der View-Funktion die entsprechende URL erzeugt.

Dies hat viele Vorteile gegenüber fest kodierten URL-Strings:

  • Wenn die URL-Route später geändert wird, wird alles, was durchurl_forgeneriert wird, automatisch aktualisiert.
  • Behandelt automatisch das Escaping von Sonderzeichen
  • Der generierte Pfad ist immer ein absoluter Pfad

Beispiel

from flask import Flask, url_for

app = Flask(__name__)

@app.route("/")
def index():
    return "Startseite"

@app.route("/login")
def login():
    return "Anmeldeseite"

@app.route("/user/<username>")
def profile(username):
    return f"Profil von {username}"

# Verwende test_request_context(), um einen Request-Kontext zu simulieren
# Dadurch kann url_for() URLs korrekt generieren
with app.test_request_context():
    print(url_for("index"))                    # Ausgabe /
    print(url_for("login"))                    # Ausgabe /login
    print(url_for("login", next="/"))          # Ausgabe /login?next=%2F
    print(url_for("profile", username="example"))  # Ausgabe /user/example

url_for()Der erste Parameter ist der Name der View-Funktion (Hinweis: Es ist der Funktionsname, nicht der URL-Pfad).

Wenn die URL dynamische Variablen enthält, übergeben Sie die entsprechenden Werte als Keyword-Argumente.

Zusätzliche unbekannte Parameter werden automatisch an den Query-String angehängt.


HTTP-Methoden

Standardmäßig reagiert die Route nur aufGET-Anfragen.

Über den Parametermethodskönnen erlaubte HTTP-Methoden angegeben werden:

Beispiel

from flask import Flask, request

app = Flask(__name__)

# Dieselbe URL antwortet sowohl auf GET- als auch auf POST-Anfragen
@app.route("/login", methods=["GET", "POST"])
def login():
    # Aktuellen Anfragetyp mit request.method ermitteln
    if request.method == "POST":
        # Übermittlung des Login-Formulars verarbeiten (wird bei POST-Anfrage ausgeführt)
        username = request.form.get("username")
        return f"<h1>Willkommen zurück, {username}!</h1>"
    else:
        # Login-Formular anzeigen (wird bei GET-Anfrage ausgeführt)
        return """
        <form method="post">
<input type="text" name="username" placeholder="Benutzername">
<input type="submit" value="Anmelden">
        </form>
        """

Kurzschreibweise für Methoden-Decorator

Flask bietet Kurz-Dekoratoren für gängige HTTP-Methoden, um den Code klarer zu machen:

Beispiel

# Entspricht @app.route("/login", methods=["GET"])
@app.get("/login")
def login_form():
    return "<form>...</form>"

# Entspricht @app.route("/login", methods=["POST"])
@app.post("/login")
def login_submit():
    return "Anmeldung erfolgreich"

# Unterstützt außerdem @app.put(), @app.delete(), @app.patch()
@app.delete("/post/<int:post_id>")
def delete_post(post_id):
    # API zum Löschen eines Artikels
    return f"Artikel {post_id} gelöscht"
Komfort-Dekoratoren Äquivalente Syntax Typische Verwendung
@app.get("/path") @app.route("/path", methods=["GET"]) Daten abrufen, Seite anzeigen
@app.post("/path") @app.route("/path", methods=["POST"]) Daten erstellen, Formular absenden
@app.put("/path") @app.route("/path", methods=["PUT"]) Daten aktualisieren (vollständige Ersetzung)
@app.delete("/path") @app.route("/path", methods=["DELETE"]) Daten löschen
@app.patch("/path") @app.route("/path", methods=["PATCH"]) Daten aktualisieren (teilweise Aktualisierung)

Automatisch behandeltWenn die Route dieGETMethode definiert, fügt Flask automatisch Unterstützung fürHEADUnterstützung für Methoden hinzu. AußerdemOPTIONSMethoden werden normalerweise automatisch behandelt.


Mehrere Routen gleichzeitig binden

Dieselbe View-Funktion kann an mehrere Routen gebunden werden:

Beispiel

# Zwei verschiedene URLs verweisen auf dieselbe View-Funktion
@app.route("/hello")
@app.route("/hello/<name>")
def greet(name=None):
    # name hat den Standardwert None; beim Besuch von /hello ist name None
    if name is None:
        return "<h1>Hello, World!</h1>"
    return f"<h1>Hello, {name}!</h1>"

Besuchen Sie/hello, wennnameden StandardwertNone verwendet, beim Aufrufen von/hello/example, wennnamegleich"example" ist。

Weitere Erweiterungen