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

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