Extraire l'URL dans un template Django : request.path vs path_info vs get_full_path vs build_absolute_uri
Il arrive souvent de devoir connaître l'URL courante dans un template Django.
- Activer le menu « actuel »
- Rediriger vers la page d'origine après connexion (paramètre
next) - Générer un lien canonique ou un lien partageable
- Créer un lien qui reproduit exactement la page courante, y compris la chaîne de requête
Mais il existe plusieurs attributs et méthodes qui semblent similaires, ce qui peut prêter à confusion. Aujourd'hui, nous comparons clairement les quatre options suivantes.
request.pathrequest.path_inforequest.get_full_path()request.build_absolute_uri()
Où vient {{ request }} ?
La présence de {{ request }} dans un template indique généralement que le processus de contexte de requête est activé.
django.template.context_processors.requestinsère l'objetrequestdans le contexte du template.- Ce processeur de contexte est exécuté lorsqu'il est enregistré dans
TEMPLATES→OPTIONS['context_processors'].
En pratique, Django inclut par défaut ce processeur, donc la plupart des développeurs n'ont pas besoin de le configurer manuellement.
L'objet request lui‑même est une instance de HttpRequest (ou d'un sous‑type WSGI/ASGI) créé par Django lorsqu'une requête arrive et est passé à la vue. Cet objet possède des attributs tels que path et path_info.

Résumé en une phrase : mémorisez ces quatre éléments
path: « chemin sans domaine »path_info: « chemin réel que l'application voit (sans le préfixe du script) »get_full_path(): «path+ chaîne de requête »build_absolute_uri(): « schéma + hôte + chemin complet (URL absolue) »
Examinons maintenant chaque option en détail.
1) request.path : le « chemin » sans domaine
request.path renvoie uniquement le chemin de la requête, sans le schéma ni le domaine. Exemple :
/music/bands/the_beatles/
Quand est-ce utile ?
- Comparaison simple pour activer un menu
django
{% if request.path == "/settings/" %}active{% endif %}
* Déterminer la catégorie d'une page via un préfixe
django
{% if request.path|slice:":5" == "/api/" %}...{% endif %}
2) request.path_info : le « chemin réel » qui résiste aux changements d'environnement
Le point clé dans la documentation Django est le suivant :
- Dans certains serveurs, l'URL est divisée en préfixe du script (SCRIPT_NAME) et path info.
path_infocontient toujours la partie path info, donc il est moins dépendant de l'environnement.
En pratique, si votre application est montée sous un préfixe comme /app (proxy inverse, déploiement sous sous‑chemin), path et path_info peuvent différer.
Quand est-ce utile ?
- Environnements de déploiement sous sous‑chemin (ex :
/app/) - Tests ou serveurs de production où le préfixe peut changer
Sur un domaine unique à la racine (
/),pathetpath_infosont identiques, mais la différence devient pertinente lorsqu'on change d'environnement.
3) request.get_full_path() : path + chaîne de requête
get_full_path() renvoie le path suivi de la chaîne de requête. Exemple :
/music/bands/the_beatles/?print=true
Quand est-ce utile ?
- Lien de rafraîchissement ou de partage qui reproduit exactement la page courante
django
<a href="{{ request.get_full_path }}">Lien de rafraîchissement</a>
* Créer un paramètre next après authentification
django
<a href="/login/?next={{ request.get_full_path|urlencode }}">Connexion</a>
Django propose également
get_full_path_info(), qui se base surpath_info. Ce n'est pas notre sujet aujourd'hui, mais il est bon de le connaître.
4) request.build_absolute_uri() : URL absolue complète (schéma + domaine)
build_absolute_uri() construit une URI absolue à partir de la requête courante.
Exemple :
https://example.com/music/bands/the_beatles/?print=true
Quand est-ce utile ?
- Partage par e‑mail ou messagerie où le domaine est indispensable
- Balises méta canonique, og:url, etc.
- Fournir une URL de rappel à un système externe
Précautions
build_absolute_uri() dépend de l'information d'hôte fournie par la requête (get_host()). Cela ne reflète pas toujours l'URL réelle que l'utilisateur a saisie. Si vous utilisez un proxy inverse ou avez une logique personnalisée pour get_host(), le résultat peut différer de l'URL affichée dans le navigateur. Vérifiez toujours votre configuration de déploiement.
Conclusion et résumé
- Activer le menu :
request.path - Environnements sous sous‑chemin :
request.path_info - Inclure la chaîne de requête :
request.get_full_path() - Lien complet avec domaine :
request.build_absolute_uri()
Articles connexes :