# 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`.

---
## 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 + cadena de consulta (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/)