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
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
@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
@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
# 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
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
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
@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
@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