('

Obtener la URL en plantillas de Django: request.path vs path_info vs get_full_path vs build_absolute_uri

\n

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
\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
    \n
  • request.path
  • \n
  • request.path_info
  • \n
  • request.get_full_path()
  • \n
  • request.build_absolute_uri()
  • \n
\n
\n

¿De dónde viene {{ request }}?

\n

La aparición de {{ request }} en una plantilla indica que el procesador de contexto de request está habilitado.

\n
    \n
  • django.template.context_processors.request inserta el objeto request en el contexto de la plantilla.
  • \n
  • Este procesador se activa cuando se registra en TEMPLATESOPTIONS[\'context_processors\'].
  • \n
\n

Django, por defecto, incluye este procesador, por lo que los desarrolladores no suelen notar su presencia.

\n

El objeto request es una instancia de HttpRequest (subclase de WSGI/ASGI) que contiene atributos como path y path_info.

\n

Django como un mago sacando herramientas de su sombrero

\n
\n

Conclusión rápida: memoriza estos cuatro

\n
    \n
  • path: “solo la ruta, sin dominio”
  • \n
  • path_info: “la ruta real que ve la aplicación (sin prefijo de script)”
  • \n
  • get_full_path(): “path + cadena de consulta”
  • \n
  • build_absolute_uri(): “esquema + host + ruta completa (URL absoluta)”
  • \n
\n

Ahora veamos cada uno con detalle.

\n
\n

1) request.path: ruta sin dominio

\n

request.path devuelve la ruta de la solicitud sin el dominio ni el esquema. Ejemplo:

\n
    \n
  • /music/bands/the_beatles/
  • \n
\n

¿Cuándo es útil?

\n
    \n
  • Comparaciones simples, como activar un menú
  • \n
\n

django\n {% if request.path == "/settings/" %}active{% endif %}\n* Comparar prefijos para determinar la categoría de la página

\n

django\n {% if request.path|slice:":5" == "/api/" %}...{% endif %}

\n
\n

2) request.path_info: ruta real, menos dependiente del entorno

\n

El 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_info siempre contiene la parte path info, lo que lo hace menos dependiente del entorno.
  • \n
\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.

\n

¿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
\n

En un dominio raíz único (/), path y path_info suelen coincidir, pero cambian cuando el entorno varía.

\n
\n
\n

3) request.get_full_path(): path + cadena de consulta

\n

get_full_path() devuelve la ruta con la cadena de consulta añadida. Ejemplo:

\n
    \n
  • /music/bands/the_beatles/?print=true
  • \n
\n

¿Cuándo es útil?

\n
    \n
  • Cuando se necesita un enlace que reproduzca exactamente la página actual (compartir, refrescar, volver).
  • \n
\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

\n

django\n <a href="/login/?next={{ request.get_full_path|urlencode }}">Iniciar sesión</a>

\n
\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.

\n
\n
\n

4) request.build_absolute_uri(): URL absoluta con esquema y dominio

\n

build_absolute_uri() construye una URL absoluta a partir de la solicitud actual.

\n

Ejemplo típico:

\n
    \n
  • https://example.com/music/bands/the_beatles/?print=true
  • \n
\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 canonical o og:url.
  • \n
  • Al pasar una URL de retorno a sistemas externos.
  • \n
\n

Precauciones

\n

build_absolute_uri() depende de la información de host de la solicitud (get_host()).

\n
    \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
\n

Resumen

\n
    \n
  • Activar menúrequest.path
  • \n
  • Comparar en entornos de subrutarequest.path_info
  • \n
  • Incluir cadena de consultarequest.get_full_path()
  • \n
  • Enlace completo con dominiorequest.build_absolute_uri()
  • \n
\n
\n

Artículos relacionados:

\n', '/media/editor_temp/6/c112847e-a9ca-4d58-9a3f-076a20bfbef7.png')