Redirecciones en Django: tipos, usos y cómo mantener tu SEO al cambiar URLs
Índice de contenido
- ¿Qué es una redirección HTTP y por qué importa en Django?
- Qué significa redirigir una vista en Django
- Cuándo usar 301 y cuándo 302: guía rápida para SEO
- Métodos para hacer redirecciones en Django
- Usar redirect() en vistas (el método más directo)
- HttpResponseRedirect y HttpResponsePermanentRedirect
- Redirecciones con reverse() y parámetros dinámicos
- Redirecciones a URLs externas o en otros dominios
- Django return redirect() con parámetros
- Casos prácticos que uso en mis proyectos
- Probar y verificar tus redirecciones
- Errores frecuentes y cómo solucionarlos
- NoReverseMatch y namespaces mal definidos
- Redirecciones en login/logout que no funcionan
- Preguntas frecuentes sobre redirecciones en Django
- Conclusión
Cuando desarrollamos en cualquier proyecto web y en Django NO viene siendo la excepción aparte de tener nombrados para nuestras rutas, tenemos que hacer redirecciones; las redirecciones son una de esas herramientas que usamos casi sin pensarlo, pero que tienen un papel clave tanto en la experiencia del usuario como en el SEO técnico.
Usar bien las redirecciones es lo que marca la diferencia entre una app ordenada y un caos de enlaces rotos.
Las redirecciones en Django son el mecanismo que tenemos para enviar de una página a otra que tengamos configurada en nuestra app en Django; las redirecciones no son más que el comportamiento de enviar a un cliente o usuario a otra página, ya sea de nuestra aplicación o de otra aplicación; para el seo, usualmente se usa el código de 302 para hacer este tipo de operaciones; un ejemplo común de redirecciones es cuando tenemos un post o publicación en la cual, cambiamos el título y con esto el slug pero no queremos perder el posicionamiento de post original, en estos casos, podemos hacer una redirección de tipo 302 al nuevo enlace.
¿Qué es una redirección HTTP y por qué importa en Django?
Una redirección HTTP es simplemente una instrucción que le dice al navegador: “no te quedes aquí, ve a otra URL”.
En Django, este comportamiento se implementa con funciones específicas que devuelven una respuesta HTTP de tipo 3xx.
Qué significa redirigir una vista en Django
Cuando una vista procesa un formulario o una acción, muchas veces no tiene un template asociado. En esos casos, lo ideal es redirigir al usuario a otra página.
En mis proyectos, por ejemplo, cuando un usuario crea un registro, lo envío directamente a la página de detalle o al listado general, según la lógica de negocio.
Códigos de estado más usados (301, 302 y 307)
- 301 (Permanente): indica que la URL ha cambiado definitivamente. Ideal para SEO y cambios de slug.
- 302 (Temporal): se usa cuando la redirección es momentánea (por ejemplo, mientras pruebas una vista).
- 307: versión más estricta del 302; mantiene el método original (POST/GET).
Cuándo usar 301 y cuándo 302: guía rápida para SEO
Cuando cambié el slug de un post en mi blog, usé una redirección 301 para no perder tráfico ni backlinks.
En cambio, para redirecciones internas tras enviar formularios, suelo usar 302, ya que son transitorias.
Métodos para hacer redirecciones en Django
Las redirecciones son un comportamiento común que cuando -por ejemplo- mandamos una petición para crear un registro, esta función puede que no tenga asociada un template, por el propósito de la misma; por lo tanto lo que hacemos son redirecciones:
- Si la data es correcta, hacemos una redirección al listado, formulario de creación o actualización.
- Si la data tiene problemas con las validaciones lo mandamos a la página de creación.
Así que, para las siguientes rutas:
app_name="gestion"
urlpatterns = [
path('',views.index, name="index"),
path('detail/<int:pk>',views.show, name="show"),
path('create',views.create, name="create"),
path('update/<int:pk>',views.update, name="update"),
path('delete/<int:pk>',views.delete, name="delete")
]Django ofrece varias formas de redirigir, dependiendo del contexto.
Usar redirect() en vistas (el método más directo)
Y si queremos hacer una redirección:
from django.shortcuts import redirect
return redirect('gestion:index')Un poco más completo:
from django.shortcuts import redirect
def create(request):
form = ProductForm(request.POST or None)
if form.is_valid():
product = Product()
product.title = form.cleaned_data['title']
***
product.save()
return redirect('gestion:update', pk=product.id)
return redirect('gestion:create')El patron es el siguiente:
- Si todo sale bien, redirijo al formulario de edición.
- Si algo falla, vuelvo a la vista de creación.
HttpResponseRedirect y HttpResponsePermanentRedirect
Estas clases permiten controlar explícitamente el tipo de redirección:
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
# Temporal (302)
return HttpResponseRedirect('/productos/')
# Permanente (301)
return HttpResponsePermanentRedirect('/nuevo-producto/')Útiles cuando quieres un control fino del código de estado.
Redirecciones con reverse() y parámetros dinámicos
Django permite construir la URL a partir del nombre de la ruta y sus parámetros:
from django.urls import reverse
return redirect(reverse('gestion:show', kwargs={'pk': 15}))Es una práctica segura, sobre todo si cambias tus rutas en urls.py.
Redirecciones a URLs externas o en otros dominios
Si necesitas redirigir fuera de tu aplicación, simplemente pasa la URL completa:
return redirect('https://www.google.com')Redireccionamos indicando el nombre de la app, seguido de dos puntos, seguido del nombre de la ruta.
Django return redirect() con parámetros
También es posible redireccionar con parámetros:
return redirect('update', pk=15)Casos prácticos que uso en mis proyectos
- Redirigir tras crear o actualizar un registro
- En mi flujo habitual, después de guardar un producto, redirijo al detalle o al listado.
Esto mejora la UX y evita que el usuario recargue el formulario accidentalmente.
- En mi flujo habitual, después de guardar un producto, redirijo al detalle o al listado.
- Manejo de formularios: validar, guardar y redirigir correctamente
- Si los datos no son válidos, siempre redirijo al formulario original mostrando los errores.
Es un pequeño gesto que evita confusión y mantiene la app fluida.
- Si los datos no son válidos, siempre redirijo al formulario original mostrando los errores.
- Cambiar el slug de un post y redirigir con 301 para no perder tráfico
- Una vez, al actualizar títulos de artículos, los slugs antiguos quedaron obsoletos.
Implementé una redirección 301 en urls.py hacia la nueva ruta. Resultado: mantuve mi tráfico orgánico sin perder posicionamiento.
- Una vez, al actualizar títulos de artículos, los slugs antiguos quedaron obsoletos.
- Cómo evitar bucles infinitos y errores comunes
- Un error típico es redirigir a la misma vista que causa la redirección.
- Para evitarlo, verifica siempre las condiciones antes de devolver la respuesta:
if request.path != reverse('home'): return redirect('home')
Probar y verificar tus redirecciones
Cómo testear redirecciones con el Client() de Django
Puedes automatizar pruebas para asegurarte de que tus vistas redirigen correctamente:
from django.test import Client
client = Client()
response = client.post('/crear/', {'title': 'Nuevo'})
assert response.status_code == 302Usar assertRedirects en tests automatizados
Más elegante aún:
self.assertRedirects(response, '/listado/')Comprobar tus redirecciones con curl o herramientas SEO
En terminal, ejecuta:
$ curl -I https://tusitio.com/old-url/Así verificas si el código es 301 o 302.
También puedes revisar redirecciones en Google Search Console o Screaming Frog.
Errores frecuentes y cómo solucionarlos
NoReverseMatch y namespaces mal definidos
Ocurre cuando el nombre de la URL no coincide. Revisa tu app_name y los path():
app_name = 'gestion'
path('detalle/<int:pk>', views.show, name='show')Llamar redirect('gestion:show', pk=1) solucionará el error.
Redirecciones en login/logout que no funcionan
Si usas vistas genéricas como LoginView, define next o success_url correctamente:
class CustomLoginView(LoginView):
success_url = reverse_lazy('dashboard')Parámetros perdidos o rutas incorrectas
Asegúrate de pasar args o kwargs completos; si no, Django no sabrá construir la URL.
Preguntas frecuentes sobre redirecciones en Django
¿Cuál es la diferencia entre redirect() y HttpResponseRedirect?
redirect() es un atajo que decide automáticamente el tipo de respuesta; HttpResponseRedirect devuelve siempre un 302.
¿Puedo redirigir con parámetros?
Sí, usando kwargs o reverse() para construir la URL con argumentos dinámicos.
¿Qué pasa con el SEO si cambio el slug de una URL?
Si no haces una redirección 301, pierdes el tráfico. En mi caso, fue la diferencia entre mantener posiciones o desaparecer de Google.
¿Cómo pruebo mis redirecciones antes de producción?
Con curl -I o en el panel de Search Console puedes comprobar el código de estado y destino final.
Conclusión
Las redirecciones en Django no solo son una herramienta técnica, sino una aliada del SEO y la experiencia de usuario.
En mis proyectos, aplicar correctamente 301 y 302 me ha permitido mantener tráfico, evitar errores y tener flujos más claros.
Si planificas tus rutas, validas tus formularios y pruebas tus redirecciones, evitarás muchos dolores de cabeza.
El siguiente paso es seguir con nuestro CRUD y aprende a eliminar registros.
Acepto recibir anuncios de interes sobre este Blog.
Las redirecciones en Django son el mecanismo que tenemos para enviar de una página a otra que tengamos configurada en nuestra app en Django.