HOWTO · Flask

Dynamische URLs mit url_for in Flask erstellen

Erfahren Sie, wie Flask mit url_for() URLs anhand von View-Endpunkten erstellt, dynamische Routenwerte einsetzt, Weiterleitungen ermöglicht und Links in Jinja erzeugt.

Auf dieser Seite

In Flask erstellt url_for() eine URL für einen Endpunkt, meist den Namen einer View-Funktion. Übergebe Routenwerte als Schlüsselwortargumente, um dynamische Pfadabschnitte zu füllen. Die Funktion gibt eine URL-Zeichenfolge zurück. Damit der Browser diese URL aufruft, muss eine View eine redirect()-Antwort zurückgeben.

So erstellt url_for() eine URL

Flask registriert jede View unter einem Endpunkt. Standardmäßig entspricht der Endpunktname dem Namen der View-Funktion. Daher verweist url_for("index") auf eine View namens index. Flask sucht die Route für diesen Endpunkt und erstellt daraus die URL. So bleiben Links an die Routendefinitionen gebunden, statt dass Pfadzeichenfolgen überall in der Anwendung wiederholt werden müssen.

Das Ergebnis ist ein Pfad wie / oder /users/Harry. Hat eine Route variable Abschnitte, übergib ihre Werte mit den passenden Schlüsselwortnamen. Zusätzliche Werte, die nicht zur Route gehören, werden als Abfrageparameter angefügt. Das Erstellen einer URL löst weder eine Anfrage aus noch leitet es Besucher weiter.

Eine URL aus einer View-Funktion erstellen

Die folgende kleine Anwendung enthält eine Startseiten-View, eine Profil-View, eine weiterleitende View und eine Jinja-Seite. Ihr Test-Client ruft die Jinja-Seite ab und prüft die Weiterleitungsantwort, ohne einen Server zu starten. Installiere Flask in der Python-Umgebung, bevor du das Beispiel ausführst. In der bereitgestellten Laufzeitumgebung erzeugte der Test-Client den Link und erhielt eine 302-Antwort mit /users/Harry als Location-Header.

Führe dieses Beispiel aus:

from flask import Flask, redirect, render_template_string, url_for

app = Flask(__name__)


@app.get("/")
def index():
    return "Home"


@app.get("/users/<string:user_name>")
def profile(user_name):
    return f"Profile: {user_name}"


@app.get("/go")
def go():
    return redirect(url_for("profile", user_name="Harry"))


@app.get("/links")
def links():
    return render_template_string(
        '<a href="{{ url_for(\'profile\', user_name=\'Josh\') }}">Profile</a>'
    )


with app.test_client() as client:
    page = client.get("/links")
    print(page.get_data(as_text=True))
    response = client.get("/go", follow_redirects=False)
    print(response.status_code)
    print(response.headers["Location"])
<a href="/users/Josh">Profile</a>
302
/users/Harry

Das Endpunktargument lautet profile, also wie die View-Funktion. Wenn Flask /go verarbeitet, erstellt url_for() den Profilpfad, und redirect() gibt eine Weiterleitungsantwort dorthin zurück. Der Test-Client gibt zuerst den gerenderten Link und danach den Weiterleitungsstatus sowie den Location-Header aus. Mit url_for("index") würde dieselbe Anwendung den Pfad zur Startseite erstellen.

Dynamische Routenwerte übergeben

Die Route /users/<string:user_name> deklariert eine Variable namens user_name. Der Aufruf url_for("profile", user_name="Harry") übergibt einen Wert für genau diese Variable. Flask fügt den Wert in den Pfad ein und kodiert ihn bei Bedarf für eine URL. Achte darauf, dass der Endpunkt und jeder Routenvariablenname zur View und zu den Schlüsselwortargumenten passen. Andernfalls kann Flask die Route beim Erstellen der URL nicht zuordnen.

Bei einer Route wie /articles/<int:article_id> übergibst du mit url_for("article", article_id=42) eine Ganzzahl. Werte, die keiner Routenvariablen zugeordnet sind, etwa sort="recent", werden zu Abfrageparametern. Verwende Routenvariablen für die Pfadstruktur und zusätzliche Schlüsselwortargumente für Abfragedaten.

Mit einer erstellten URL weiterleiten

Gib innerhalb einer View redirect(url_for("profile", user_name="Harry")) zurück. url_for() liefert den Zielpfad, während redirect() die HTTP-Antwort erstellt, die den Browser zur Navigation dorthin auffordert. Die View /go im Beispiel verwendet dieses Muster. Würdest du nur url_for(...) zurückgeben, würde die URL-Zeichenfolge als Antwortinhalt gesendet; der Browser würde dadurch nicht navigieren.

Diese Unterscheidung ist hilfreich, wenn sich Routen ändern: Die Weiterleitung zielt weiterhin auf die registrierte Route des Endpunkts, sodass die View keinen fest codierten Pfad benötigt. Wähle das Weiterleitungsverhalten bewusst, denn eine Weiterleitung ist die Antwort auf die aktuelle Anfrage; der Browser ruft das Ziel anschließend separat ab.

Verwende in einer Jinja-Vorlage denselben Endpunkt und dieselben Routenwerte im href-Attribut eines Ankerelements:

<a href="{{ url_for('profile', user_name='Josh') }}">Profile</a>

Hier entspricht profile dem View-Namen, und user_name füllt den erforderlichen Routenabschnitt. Das ausführbare Beispiel rendert diese Vorlagenzeichenfolge unter /links; der erzeugte Link verweist daher auf die Profilroute. Das sichtbare Linklabel „Profile“ bleibt im unveränderten Beispiel auf Englisch. Für eine in einer Datei gespeicherte Vorlage gib sie mit Flasks render_template("index.html") zurück und lege die Datei im Verzeichnis templates der Anwendung ab. Übergib keinen Routenwert, den der Zielendpunkt nicht deklariert, und verwende die genaue Schreibweise des in der Anwendung registrierten Endpunkts.