El libro de Django 1.0

14.4. Redirects

El framework redirects de Django te permite administrar las redirecciones con facilidad almacenándolos en una base de datos y tratándolos como cualquier otro objeto modelo de Django. Por ejemplo puedes usar el framework redirects para indicarle a Django "Redirecciona cualquier petición de /music/ a /sections/arts/music/.". Esto es útil cuando necesitas cambiar las cosas de lugar en tu sitio; los desarrolladores Web deberían hacer lo que esté en sus manos para evitar los enlaces rotos.

14.4.1. Usar el framework redirects

Para instalar la aplicación redirects, sigue estos pasos:

  1. Agrega 'django.contrib.redirects' a tu INSTALLED_APPS.
  2. Agrega 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' a tu variable de configuración MIDDLEWARE_CLASSES.
  3. Ejecuta el comando manage.py syncdb para instalar la única tabla necesaria a tu base de datos.

manage.py syncdb crea una tabla django_redirect en tu base de datos. Esta se trata sencillamente de una tabla de búsqueda con campos site_id, old_path y new_path.

Puedes crear redirecciones tanto a través de la interfaz de administración como a través de la API de base de datos de Django. Para más información puedes leer la sección "Agregando, modificando y eliminando redirecciones".

Una vez que has creado redirecciones, la clase RedirectFallbackMiddleware se encarga de todo el trabajo. Cada vez que cualquier aplicación Django lanza un error 404, este middleware verifica como último recurso la base de datos de redirects en búsqueda de la URL que se ha requerido. Específicamente busca un redirect con el old_path provisto y con un identificador de sitio que coincida con la variable de configuración SITE_ID. (para más información acerca de SITE_ID y el framework sites, consulta la sección "Sites"). Luego entonces realiza los siguientes pasos:

  • Si encuentra una coincidencia y new_path no está vacío, redirecciona la petición a new_path.
  • Si encuentra una coincidencia y new_path está vació, envía una cabecera HTTP 410 ("Ausente") y una respuesta vacía (sin contenido).
  • Si no encuentra una coincidencia, el procesamiento de la petición continúa normalmente.

El middleware sólo se activa ante errores 404 — no en errores 500 o respuestas con otros códigos de estado.

Notar que el orden de MIDDLEWARE_CLASSES es relevante. Generalmente puedes colocar RedirectFallbackMiddleware cerca del final de la lista, debido a que se trata de una opción de último recurso.

Nota Si usas los middlewares redirect y flatpages, analiza cual de los dos (redirect o flatpages) desearías sea ejecutado primero. Sugerimos configurar flatpages antes que redirects (o sea colocar el middleware flatpages antes que el middleware redirects) pero tu podrías decidir lo contrario.

14.4.2. Agregar, modificar y eliminar redirecciones

Puedes agregar, modificar y eliminar redirecciones de dos maneras:

14.4.2.1.  Vía la interfaz de administración

Si has activado la interfaz automática de administración de Django, deberías ver una sección "Redirects" en la página de índice de la aplicación admin. Edita las redirecciones como lo harías con cualquier otro objeto en el sistema.

14.4.2.2. Vía la API Python

Las redirecciones se representan mediante un modelo estándar Django que reside en django/contrib/redirects/models.py. Por lo tanto puedes acceder a los objetos redirect vía la API de base de datos de Django, por ejemplo:

>>> from django.contrib.redirects.models import Redirect
>>> from django.contrib.sites.models import Site
>>> red = Redirect(
...     site=Site.objects.get(id=1),
...     old_path='/music/',
...     new_path='/sections/arts/music/',
... )
>>> red.save()
>>> Redirect.objects.get(old_path='/music/')
<Redirect: /music/ ---> /sections/arts/music/>