# 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`.

---
## 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 + chaîne de requête (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/)