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.path
  • request.path_info
  • request.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.request insère l'objet request dans le contexte du template.
  • Ce processeur de contexte est exécuté lorsqu'il est enregistré dans TEMPLATESOPTIONS['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.

Django, le magicien, sort un objet request de son chapeau


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_info contient 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 (/), path et path_info sont 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 sur path_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 :