# 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 }}` ? {#sec-e3874691b2fc} 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 `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`. ![Django, le magicien, sort un objet request de son chapeau](/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png) --- ## Résumé en une phrase : mémorisez ces quatre éléments {#sec-0f722c9bd67c} * **`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 {#sec-26a629a2d24e} `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 ? {#sec-b307f735685f} * 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 {#sec-fd1e8e14948f} 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 ? {#sec-2985f0c9cd7c} * 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 {#sec-1364e4e65388} `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 ? {#sec-0ac89fe1b7cd} * Lien de rafraîchissement ou de partage qui reproduit exactement la page courante ```django Lien de rafraîchissement ``` * Créer un paramètre `next` après authentification ```django Connexion ``` > 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) {#sec-0ba80b4c4700} `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 ? {#sec-428d3d6b9613} * 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 {#sec-b24dccc132d6} `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é {#sec-bd7ea169a316} * **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** : - [Qu'est-ce qu'un reverse proxy ? Différences avec un forward proxy, objectifs, scénarios d'utilisation](/ko/whitedec/2025/12/10/reverse-proxy-forward-proxy-differences/) - [Revenir à zéro avec Django : roadmap d'apprentissage à partir du HTTP](/ko/whitedec/2025/12/22/django-first-learning-roadmap/)