Obtener la URL en plantillas de Django: request.path vs path_info vs get_full_path vs build_absolute_uri
En las plantillas de Django a menudo necesitamos conocer la URL actual.
- Activar el menú de navegación “activo”
- Redirigir a la página original después de iniciar sesión (next)
- Crear URLs canónicas o enlaces compartibles
- Generar un enlace que incluya la cadena de consulta y sea idéntico a la página actual
Sin embargo, además de {{ request.path }} existen varias opciones similares que pueden confundir. Hoy compararemos de forma clara las cuatro más relevantes.
request.pathrequest.path_inforequest.get_full_path()request.build_absolute_uri()
¿De dónde viene {{ request }}?
La aparición de {{ request }} en una plantilla indica que el procesador de contexto de request está habilitado.
django.template.context_processors.requestinserta el objetorequesten el contexto de la plantilla.- Este procesador se activa cuando se registra en
TEMPLATES→OPTIONS['context_processors'].
Django, por defecto, incluye este procesador, por lo que los desarrolladores no suelen notar su presencia.
El objeto request es una instancia de HttpRequest (subclase de WSGI/ASGI) que contiene atributos como path y path_info.

Conclusión rápida: memoriza estos cuatro
path: “solo la ruta, sin dominio”path_info: “la ruta real que ve la aplicación (sin prefijo de script)”get_full_path(): “path+ cadena de consulta”build_absolute_uri(): “esquema + host + ruta + cadena de consulta (URL absoluta)”
Ahora veamos cada uno con detalle.
1) request.path: ruta sin dominio
request.path devuelve la ruta de la solicitud sin el dominio ni el esquema. Ejemplo:
/music/bands/the_beatles/
¿Cuándo es útil?
- Comparaciones simples, como activar un menú
django
{% if request.path == "/settings/" %}active{% endif %}
* Comparar prefijos para determinar la categoría de la página
django
{% if request.path|slice:":5" == "/api/" %}...{% endif %}
2) request.path_info: ruta real, menos dependiente del entorno
El punto clave en la documentación de Django es:
- En algunas configuraciones de servidor, la ruta se divide en SCRIPT_NAME (prefijo de script) y path info.
path_infosiempre contiene la parte path info, lo que lo hace menos dependiente del entorno.
En entornos donde la aplicación se monta bajo un prefijo (por ejemplo, /app con un proxy inverso o despliegue en subruta), path y path_info pueden diferir.
¿Cuándo es útil?
- Cuando se despliega la aplicación en una subruta y se necesita la ruta basada en la aplicación.
- Cuando el prefijo puede cambiar entre servidores de prueba y producción.
En un dominio raíz único (
/),pathypath_infosuelen coincidir, pero cambian cuando el entorno varía.
3) request.get_full_path(): path + cadena de consulta
get_full_path() devuelve la ruta con la cadena de consulta añadida. Ejemplo:
/music/bands/the_beatles/?print=true
¿Cuándo es útil?
- Cuando se necesita un enlace que reproduzca exactamente la página actual (compartir, refrescar, volver).
django
<a href="{{ request.get_full_path }}">Enlace de refresco</a>
* Para crear un parámetro next después de iniciar sesión o verificar permisos
django
<a href="/login/?next={{ request.get_full_path|urlencode }}">Iniciar sesión</a>
Django también ofrece
get_full_path_info(), que se basa enpath_info. No es el foco de esta comparación, pero vale la pena conocerlo.
4) request.build_absolute_uri(): URL absoluta con esquema y dominio
build_absolute_uri() construye una URL absoluta a partir de la solicitud actual.
Ejemplo típico:
https://example.com/music/bands/the_beatles/?print=true
¿Cuándo es útil?
- En enlaces que se comparten por correo electrónico o mensajería, donde el dominio es imprescindible.
- En metaetiquetas como
canonicaloog:url. - Al pasar una URL de retorno a sistemas externos.
Precauciones
build_absolute_uri() depende de la información de host de la solicitud (get_host()).
- Si el host real difiere del valor que devuelve
get_host()(por ejemplo, en un proxy inverso o en lógica de multitenancy), el resultado puede no coincidir con la URL visible en el navegador. - Es importante revisar la configuración del servidor y cualquier lógica de dominio personalizada.
Resumen
- Activar menú →
request.path - Comparar en entornos de subruta →
request.path_info - Incluir cadena de consulta →
request.get_full_path() - Enlace completo con dominio →
request.build_absolute_uri()
Artículos relacionados:
No hay comentarios.