URL aus Django-Templates holen: request.path vs path_info vs get_full_path vs build_absolute_uri
In Django-Templates ist es häufig nötig, die aktuelle URL zu kennen.
\n- \n
- Navigation – „aktuelles Menü aktivieren“ \n
- Nach dem Login – „zur vorherigen Seite zurückkehren (next)“ \n
- Canonical‑URL / Share‑Link erstellen \n
- Mit Query‑String die „genaue aktuelle Seite“ verlinken \n
Doch neben {{ request.path }} gibt es noch mehrere ähnliche Optionen, die leicht verwirren. Heute vergleichen wir die vier wichtigsten sauber.
- \n
request.path\nrequest.path_info\nrequest.get_full_path()\nrequest.build_absolute_uri()\n
\n
Woher kommt {{ request }}?
\nDass {{ request }} in einem Template erscheint, bedeutet in der Regel, dass der Request‑Context‑Processor aktiviert ist.
- \n
django.template.context_processors.requestfügt dem Template‑Kontext dasrequest‑Objekt hinzu. \n- Dieser Context‑Processor wird in
TEMPLATES→OPTIONS[\'context_processors\']registriert. \n
Django legt standardmäßig das request‑Objekt als globalen Kontext ein, sodass Entwickler es nicht explizit entfernen müssen. Das request‑Objekt selbst ist eine Instanz von HttpRequest (oder einer WSGI/ASGI‑Subklasse), die bei jeder Anfrage erzeugt und an die View weitergereicht wird. Darin befinden sich Attribute wie path und path_info.

\n
Kurzfassung: Merken Sie sich die vier Varianten so
\n- \n
path: „ohne Domain, nur Pfad“ \npath_info: „der echte Pfad, den die App sieht (ohne Script‑Prefix)“ \nget_full_path(): „path+ Query‑String“ \nbuild_absolute_uri(): „Schema + Host + Pfad (vollständige URL)“ \n
Jetzt betrachten wir jede Variante im Detail.
\n\n
1) request.path: Pfad ohne Domain
\nrequest.path liefert den Pfad ohne Schema oder Domain. Beispiel:
- \n
/music/bands/the_beatles/\n
Wann ist es nützlich?
\n- \n
- Einfache Vergleiche für Menü‑Aktivierung \n
django\n {% if request.path == "/settings/" %}active{% endif %}\n* Prefix‑Vergleich, z.\u202fB. „zu welcher Kategorie gehört diese Seite?“
django\n {% if request.path|slice:":5" == "/api/" %}...{% endif %}
\n
2) request.path_info: Stabiler Pfad in verschiedenen Deployments
\nWichtiger Punkt in der Django‑Dokumentation:
\n- \n
- In manchen Server‑Konfigurationen wird die URL in Script‑Prefix (SCRIPT_NAME) und path info aufgeteilt. \n
path_infoenthält immer den path‑info‑Teil, unabhängig von der Umgebung. \n
Kurz gesagt: In Setups, wo die App unter einem Prefix wie /app läuft (Reverse‑Proxy, Sub‑Path‑Deployment), können path und path_info unterschiedlich sein.
Wann ist es nützlich?
\n- \n
- Bei Sub‑Path‑Deployments (z.\u202fB.
/app/) möchte man den Pfad relativ zur App bestimmen. \n - Wenn sich der Prefix zwischen Test‑ und Produktionsservern unterscheidet. \n
\n\nIn einer einfachen Root‑Domain (
\n/) sindpathundpath_infoidentisch, aber bei anderen Deployments wird der Unterschied deutlich.
\n
3) request.get_full_path(): Pfad + Query‑String
\nget_full_path() gibt path plus Query‑String zurück. Beispiel:
- \n
/music/bands/the_beatles/?print=true\n
Wann ist es nützlich?
\n- \n
- Link, der die aktuelle Seite exakt wiederholt (Share, Refresh, Back) \n
django\n <a href="{{ request.get_full_path }}">Neuer Link</a>\n* Nach Login/Autorisierung zur ursprünglichen Seite zurückkehren
django\n <a href="/login/?next={{ request.get_full_path|urlencode }}">Login</a>
\n\nDjango bietet auch
\nget_full_path_info(), das aufpath_infobasiert. Es ist nicht Teil dieses Vergleichs, aber nützlich zu kennen.
\n
4) request.build_absolute_uri(): Vollständige URL mit Schema und Host
\nbuild_absolute_uri() erzeugt eine absolute URI basierend auf der aktuellen Anfrage.
Beispiel:
\n- \n
https://example.com/music/bands/the_beatles/?print=true\n
Wann ist es nützlich?
\n- \n
- E‑Mail‑ oder Messenger‑Links, bei denen die Domain zwingend erforderlich ist \n
- Canonical‑URL, og:url‑Meta‑Tags \n
- Callback‑URL an externe Systeme \n
Vorsichtspunkte
\nbuild_absolute_uri() nutzt intern get_host(), das auf dem Host‑Header der Anfrage basiert. Das bedeutet, es spiegelt nicht unbedingt die tatsächliche URL des Browsers wider. In Umgebungen mit Reverse‑Proxy (Nginx) oder bei bewusst konfigurierten Host‑Logiken kann die erzeugte URL von der realen abweichen. Prüfen Sie daher Ihre Deploy‑Konfiguration, wenn Sie auf die Domain vertrauen.
\n
Fazit und Zusammenfassung
\n- \n
- Menü‑Aktivierung in Templates →
request.path\n - Stabile Pfad‑Vergleich in Sub‑Path‑Deployments →
request.path_info\n - Query‑String inklusive aktuelle Seite →
request.get_full_path()\n - Vollständige externe Links (inkl. Domain) →
request.build_absolute_uri()\n
\n
Weitere Artikel:
\n', '/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png')