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.
\n- \n
- Activer le menu «\xa0actuel\xa0» \n
- Rediriger vers la page d\'origine après connexion (paramètre
next) \n - Générer un lien canonique ou un lien partageable \n
- Créer un lien qui reproduit exactement la page courante, y compris la chaîne de requête \n
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.
\n- \n
request.path\nrequest.path_info\nrequest.get_full_path()\nrequest.build_absolute_uri()\n
\n
Où vient {{ request }}\xa0?
\nLa présence de {{ request }} dans un template indique généralement que le processus de contexte de requête est activé.
- \n
django.template.context_processors.requestinsère l\'objetrequestdans le contexte du template. \n- Ce processeur de contexte est exécuté lorsqu\'il est enregistré dans
TEMPLATES→OPTIONS[\'context_processors\']. \n
En pratique, Django inclut par défaut ce processeur, donc la plupart des développeurs n\'ont pas besoin de le configurer manuellement.
\nL\'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.

\n
Résumé en une phrase\xa0: mémorisez ces quatre éléments
\n- \n
path\xa0: «\xa0chemin sans domaine\xa0» \npath_info\xa0: «\xa0chemin réel que l\'application voit (sans le préfixe du script)\xa0» \nget_full_path()\xa0: «\xa0path+ chaîne de requête\xa0» \nbuild_absolute_uri()\xa0: «\xa0schéma + hôte + chemin complet (URL absolue)\xa0» \n
Examinons maintenant chaque option en détail.
\n\n
1) request.path\xa0: le «\xa0chemin\xa0» sans domaine
\nrequest.path renvoie uniquement le chemin de la requête, sans le schéma ni le domaine. Exemple\xa0:
- \n
/music/bands/the_beatles/\n
Quand est-ce utile\xa0?
\n- \n
- Comparaison simple pour activer un menu \n
django\n {% if request.path == "/settings/" %}active{% endif %}\n* Déterminer la catégorie d\'une page via un préfixe
django\n {% if request.path|slice:":5" == "/api/" %}...{% endif %}
\n
2) request.path_info\xa0: le «\xa0chemin réel\xa0» qui résiste aux changements d\'environnement
\nLe point clé dans la documentation Django est le suivant\xa0:
\n- \n
- Dans certains serveurs, l\'URL est divisée en préfixe du script (SCRIPT_NAME) et path info. \n
path_infocontient toujours la partie path info, donc il est moins dépendant de l\'environnement. \n
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\xa0?
\n- \n
- Environnements de déploiement sous sous‑chemin (ex\xa0:
/app/) \n - Tests ou serveurs de production où le préfixe peut changer \n
\n\nSur un domaine unique à la racine (
\n/),pathetpath_infosont identiques, mais la différence devient pertinente lorsqu\'on change d\'environnement.
\n
3) request.get_full_path()\xa0: path + chaîne de requête
\nget_full_path() renvoie le path suivi de la chaîne de requête. Exemple\xa0:
- \n
/music/bands/the_beatles/?print=true\n
Quand est-ce utile\xa0?
\n- \n
- Lien de rafraîchissement ou de partage qui reproduit exactement la page courante \n
django\n <a href="{{ request.get_full_path }}">Lien de rafraîchissement</a>\n* Créer un paramètre next après authentification
django\n <a href="/login/?next={{ request.get_full_path|urlencode }}">Connexion</a>
\n\nDjango propose également
\nget_full_path_info(), qui se base surpath_info. Ce n\'est pas notre sujet aujourd\'hui, mais il est bon de le connaître.
\n
4) request.build_absolute_uri()\xa0: URL absolue complète (schéma + domaine)
\nbuild_absolute_uri() construit une URI absolue à partir de la requête courante.
Exemple\xa0:
\n- \n
https://example.com/music/bands/the_beatles/?print=true\n
Quand est-ce utile\xa0?
\n- \n
- Partage par e‑mail ou messagerie où le domaine est indispensable \n
- Balises méta canonique, og:url, etc. \n
- Fournir une URL de rappel à un système externe \n
Précautions
\nbuild_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.
\n
Conclusion et résumé
\n- \n
- Activer le menu\xa0:
request.path\n - Environnements sous sous‑chemin\xa0:
request.path_info\n - Inclure la chaîne de requête\xa0:
request.get_full_path()\n - Lien complet avec domaine\xa0:
request.build_absolute_uri()\n
\n
Articles connexes\xa0:
\n', '/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png')