# Documentation Django 3.1.9.dev

# L’application de redirection

Django est livré avec une application facultative de gestion des redirections. Elle vous permet de stocker des redirections dans une base de données et elle gère ensuite les redirections pour vous. Elle utilise par défaut le code de statut de réponse HTTP `301 Moved Permanently`.

## Installation

Pour installer l’application de redirection, procédez comme suit :

1. Veillez à ce que l’application `django.contrib.sites` soit installée.
2. Ajoutez `'django.contrib.redirects'` à votre réglage `INSTALLED_APPS`.
3. Ajoutez `'django.contrib.redirects.middleware.RedirectFallbackMiddleware'` à votre réglage `MIDDLEWARE`.
4. Lancez la commande `manage.py migrate`.

## Fonctionnement

`manage.py migrate` crée une table `django_redirect` dans votre base de données. Il s’agit d’une table de consultation avec les champs `site_id`, `old_path` et `new_path`.

L’intergiciel `RedirectFallbackMiddleware` fait tout le travail. Chaque fois qu’une application Django génère une erreur 404, cet intergiciel vérifie en dernier recours si l’URL demandée se trouve dans la base de données des redirections. Plus précisément, il cherche une redirection dont le champ `old_path` correspond à l’URL et dont l’identifiant de site correspond au réglage `SITE_ID`.

- Si une correspondance est trouvée et que `new_path` n’est pas vide, il redirige vers `new_path` en utilisant une redirection 301 (« Moved Permanently »). Il est possible de créer une sous-classe de `RedirectFallbackMiddleware` et de définir `response_redirect_class` à `django.http.HttpResponseRedirect` pour utiliser plutôt une redirection `302 Moved Temporarily`.
- Si une correspondance est trouvée et que `new_path` est vide, il envoie une erreur 410 (« Gone ») dans l’en-tête HTTP et une réponse vide (sans contenu).
- Si aucune correspondance n’est trouvée, le traitement de la requête continue normalement.

L’intergiciel ne s’active que pour les erreurs 404 – pas pour les erreurs 500 ni les réponses ayant un autre code de statut.

Notez que l’ordre dans le réglage `MIDDLEWARE` est important. En général, vous pouvez mettre `RedirectFallbackMiddleware` à la fin de la liste, parce qu’il doit être appelé en dernier recours.

Pour plus d’informations sur cet intergiciel, lisez la documentation des intergiciels.

## Ajout, modification et suppression des redirections

### Via l’interface d’administration

Si vous avez activé l’interface automatique d’administration de Django, vous devriez voir une section « Redirections » sur la page d’accueil du site d’administration. Modifiez les redirections comme vous modifiez tout autre objet dans le système.

### Via l’API Python

class `models.``Redirect`

  Les redirections sont représentées par un modèle Django standard, qui est défini dans django/contrib/redirects/models.py. Vous pouvez accéder aux objets de redirection via l’API de base de données de Django. Par exemple

      >>> from django.conf import settings
      >>> from django.contrib.redirects.models import Redirect
      >>> # Add a new redirect.
      >>> redirect = Redirect.objects.create(
      ...     site_id=1,
      ...     old_path='/contact-us/',
      ...     new_path='/contact/',
      ... )
      >>> # Change a redirect.
      >>> redirect.new_path = '/contact-details/'
      >>> redirect.save()
      >>> redirect
      <Redirect: /contact-us/ ---> /contact-details/>
      >>> # Delete a redirect.
      >>> Redirect.objects.filter(site_id=1, old_path='/contact-us/').delete()
      (1, {'redirects.Redirect': 1})

## Intergiciels (« middleware »)

class `middleware.``RedirectFallbackMiddleware`

  Vous pouvez modifier les classes `HttpResponse` utilisées par l’intergiciel en créant une sous-classe de `RedirectFallbackMiddleware` et en surchargeant les attributs `response_gone_class` ou `response_redirect_class`.

  `response_gone_class`

    La classe `HttpResponse` utilisée lorsqu’aucun `Redirect` n’est trouvé pour le chemin demandé ou qu’il possède une valeur vide pour `new_path`.

    La valeur par défaut est `HttpResponseGone`.

  `response_redirect_class`

    La classe `HttpResponse` qui se charge de la redirection.

    La valeur par défaut est `HttpResponsePermanentRedirect`.