# 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.path` * `request.path_info` * `request.get_full_path()` * `request.build_absolute_uri()` --- ## ¿De dónde viene `{{ request }}`? {#sec-e3874691b2fc} La aparición de `{{ request }}` en una plantilla indica que el **procesador de contexto de request** está habilitado. * `django.template.context_processors.request` inserta el objeto `request` en 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`. ![Django como un mago sacando herramientas de su sombrero](/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png) --- ## Conclusión rápida: memoriza estos cuatro {#sec-68355e03c60c} * **`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 completa (URL absoluta)” Ahora veamos cada uno con detalle. --- ## 1) `request.path`: ruta sin dominio {#sec-26a629a2d24e} `request.path` devuelve la ruta de la solicitud sin el dominio ni el esquema. Ejemplo: * `/music/bands/the_beatles/` ### ¿Cuándo es útil? {#sec-b307f735685f} * 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 {#sec-fd1e8e14948f} 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_info` siempre 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? {#sec-2985f0c9cd7c} * 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 (`/`), `path` y `path_info` suelen coincidir, pero cambian cuando el entorno varía. --- ## 3) `request.get_full_path()`: `path` + cadena de consulta {#sec-1364e4e65388} `get_full_path()` devuelve la ruta con la cadena de consulta añadida. Ejemplo: * `/music/bands/the_beatles/?print=true` ### ¿Cuándo es útil? {#sec-0ac89fe1b7cd} * Cuando se necesita un enlace que reproduzca exactamente la página actual (compartir, refrescar, volver). ```django Enlace de refresco ``` * Para crear un parámetro `next` después de iniciar sesión o verificar permisos ```django Iniciar sesión ``` > Django también ofrece `get_full_path_info()`, que se basa en `path_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 {#sec-0ba80b4c4700} `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? {#sec-428d3d6b9613} * En enlaces que se comparten por correo electrónico o mensajería, donde el dominio es imprescindible. * En metaetiquetas como `canonical` o `og:url`. * Al pasar una URL de retorno a sistemas externos. ### Precauciones {#sec-b24dccc132d6} `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 {#sec-bd7ea169a316} * **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**: - [¿Qué es un proxy inverso? Diferencias con el proxy directo, propósitos y escenarios de uso](/ko/whitedec/2025/12/10/reverse-proxy-forward-proxy-differences/) - [Aprende Django desde cero: un mapa de ruta que comienza con HTTP](/ko/whitedec/2025/12/22/django-first-learning-roadmap/)