('

URL ophalen in Django‑templates: request.path vs path_info vs get_full_path vs build_absolute_uri

\n

In Django‑templates komt het vaak voor dat je de huidige URL nodig hebt.

\n
    \n
  • Navigatie‑menu’s: “huidig item activeren”
  • \n
  • Na inloggen: “terug naar de pagina die je zojuist zag” (next)
  • \n
  • Canonical URL / deel‑link genereren
  • \n
  • De huidige pagina inclusief querystring delen
  • \n
\n

Maar naast {{ request.path }} zijn er nog andere, vergelijkbare opties, wat verwarring kan veroorzaken. In dit artikel vergelijken we de vier meest gebruikte:

\n
    \n
  • request.path
  • \n
  • request.path_info
  • \n
  • request.get_full_path()
  • \n
  • request.build_absolute_uri()
  • \n
\n
\n

Waar komt {{ request }} vandaan?

\n

Het verschijnen van {{ request }} in een template betekent meestal dat de request context processor is ingeschakeld.

\n
    \n
  • django.template.context_processors.request voegt het request‑object toe aan de template‑context.
  • \n
  • Deze context processor wordt geactiveerd wanneer hij is geregistreerd in TEMPLATESOPTIONS[\'context_processors\'].
  • \n
\n

Django plaatst standaard het request‑object in de globale context, tenzij je dit expliciet uitschakelt. Het request‑object zelf is een HttpRequest (in feite een WSGI/ASGI‑subclass) dat Django aan de view doorgeeft. Het bevat attributen zoals path en path_info.

\n

Django‑magier die een tool uit een hoed haalt

\n
\n

Eén regel conclusie: onthoud de vier methoden

\n
    \n
  • path: “alleen het pad, zonder domein”
  • \n
  • path_info: “het echte pad dat de app ziet (zonder script‑prefix)”
  • \n
  • get_full_path(): “path + querystring”
  • \n
  • build_absolute_uri(): “schema + host + pad (volledige URL)”
  • \n
\n

Laten we nu elk van hen in detail bekijken.

\n
\n

1) request.path: het pad zonder domein

\n

request.path geeft alleen het verzoekpad zonder domein of schema. Voorbeeld:

\n
    \n
  • /music/bands/the_beatles/
  • \n
\n

Wanneer is dit handig?

\n
    \n
  • Eenvoudige vergelijkingen voor menu‑activatie
  • \n
\n

django\n {% if request.path == "/settings/" %}active{% endif %}\n* Prefix‑vergelijking om te bepalen in welke categorie de pagina valt

\n

django\n {% if request.path|slice:":5" == "/api/" %}...{% endif %}

\n
\n

2) request.path_info: het echte pad, minder afhankelijk van de omgeving

\n

De kernpunten uit de Django‑documentatie zijn:

\n
    \n
  • In sommige serverconfiguraties wordt het URL‑pad opgesplitst in SCRIPT_NAME (script‑prefix) en PATH_INFO.
  • \n
  • path_info bevat altijd het PATH_INFO‑gedeelte, dus is minder afhankelijk van de omgeving.
  • \n
\n

Kort gezegd: bij een app die onder een prefix zoals /app draait (bijv. via een reverse proxy of sub‑path deployment), kunnen path en path_info verschillen.

\n

Wanneer is dit handig?

\n
    \n
  • Bij sub‑path deployments (bijv. /app/) wil je het pad op app‑niveau bepalen.
  • \n
  • Bij test‑ en productie‑servers met verschillende prefixes.
  • \n
\n
\n

In een typische root‑domain (/) zijn path en path_info gelijk, maar bij een andere omgeving kunnen ze verschillen.

\n
\n
\n

3) request.get_full_path(): path + querystring

\n

get_full_path() retourneert het pad inclusief de querystring. Voorbeeld:

\n
    \n
  • /music/bands/the_beatles/?print=true
  • \n
\n

Wanneer is dit handig?

\n
    \n
  • Een link om de huidige pagina te delen, te verversen of terug te gaan
  • \n
\n

django\n <a href="{{ request.get_full_path }}">Vernieuw link</a>\n* Bij login of autorisatie om de gebruiker terug te sturen naar de oorspronkelijke pagina

\n

django\n <a href="/login/?next={{ request.get_full_path|urlencode }}">Login</a>

\n
\n

Django heeft ook get_full_path_info(), die gebaseerd is op path_info. Dit is niet het onderwerp van dit artikel, maar het is goed om te weten.

\n
\n
\n

4) request.build_absolute_uri(): volledige URL inclusief schema en host

\n

build_absolute_uri() genereert een absolute URI op basis van het huidige verzoek.

\n

Voorbeeld:

\n
    \n
  • https://example.com/music/bands/the_beatles/?print=true
  • \n
\n

Wanneer is dit handig?

\n
    \n
  • E‑mail of messenger‑links waar het domein noodzakelijk is
  • \n
  • Canonical URL, og:url en andere meta‑tags
  • \n
  • Callback‑URL’s naar externe systemen
  • \n
\n

Let op

\n

build_absolute_uri() vertrouwt op de Host‑informatie van het verzoek (get_host()). Het is dus niet noodzakelijkerwijs de daadwerkelijke URL die de gebruiker heeft opgevraagd. In omgevingen met reverse proxies of aangepaste host‑logica kan de gegenereerde URL afwijken van de echte browser‑URL. Controleer daarom je deployment‑configuratie als je domein‑specifieke logica hebt.

\n
\n

Conclusie en samenvatting

\n
    \n
  • Menu‑activatie in templatesrequest.path
  • \n
  • Stabiele vergelijking in sub‑path deploymentsrequest.path_info
  • \n
  • Querystring inbegrepen voor “dezelfde pagina”request.get_full_path()
  • \n
  • Volledige link voor externe gebruikrequest.build_absolute_uri()
  • \n
\n
\n

Gerelateerde artikelen:

\n', '/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png')