{"title":"L’application de redirection","version":"5.1","locale":"fr","docname":"ref/contrib/redirects","url":"/fr/5.1/ref/contrib/redirects/","canonical":"https://djangodocs.dev/fr/5.1/ref/contrib/redirects/","summary":"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…","html":"<span id=\"the-redirects-app\"></span><h1>L’application de redirection<a class=\"heading-anchor\" href=\"#module-django.contrib.redirects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>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 <code class=\"docutils literal notranslate\"><span class=\"pre\">301</span> <span class=\"pre\">Moved</span> <span class=\"pre\">Permanently</span></code>.</p>\n<section id=\"installation\">\n<h2>Installation<a class=\"heading-anchor\" href=\"#installation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pour installer l’application de redirection, procédez comme suit :</p>\n<ol class=\"arabic simple\">\n<li><p>Veillez à ce que l’application <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> <a class=\"reference internal\" href=\"/fr/5.1/ref/contrib/sites/#enabling-the-sites-framework\"><span class=\"std std-ref\">soit installée</span></a>.</p></li>\n<li><p>Ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.redirects'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p></li>\n<li><p>Ajoutez <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.redirects.middleware.RedirectFallbackMiddleware'</span></code> à votre réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>.</p></li>\n<li><p>Lancez la commande <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code></a>.</p></li>\n</ol>\n</section>\n<section id=\"how-it-works\">\n<h2>Fonctionnement<a class=\"heading-anchor\" href=\"#how-it-works\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> crée une table <code class=\"docutils literal notranslate\"><span class=\"pre\">django_redirect</span></code> dans votre base de données. Il s’agit d’une table de consultation avec les champs <code class=\"docutils literal notranslate\"><span class=\"pre\">site_id</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">old_path</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code>.</p>\n<p>L’intergiciel <a class=\"reference internal\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectFallbackMiddleware</span></code></a> 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 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_path</span></code> correspond à l’URL et dont l’identifiant de site correspond au réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-SITE_ID\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SITE_ID</span></code></a>.</p>\n<ul class=\"simple\">\n<li><p>Si une correspondance est trouvée et que <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> n’est pas vide, il redirige vers <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> en utilisant une redirection 301 (« Moved Permanently »). Il est possible de créer une sous-classe de <a class=\"reference internal\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectFallbackMiddleware</span></code></a> et de définir <a class=\"reference internal\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_redirect_class\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_redirect_class\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">response_redirect_class</span></code></a> à <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.http.HttpResponseRedirect</span></code></a> pour utiliser plutôt une redirection <code class=\"docutils literal notranslate\"><span class=\"pre\">302</span> <span class=\"pre\">Moved</span> <span class=\"pre\">Temporarily</span></code>.</p></li>\n<li><p>Si une correspondance est trouvée et que <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> est vide, il envoie une erreur 410 (« Gone ») dans l’en-tête HTTP et une réponse vide (sans contenu).</p></li>\n<li><p>Si aucune correspondance n’est trouvée, le traitement de la requête continue normalement.</p></li>\n</ul>\n<p>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.</p>\n<p>Notez que l’ordre dans le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> est important. En général, vous pouvez mettre <a class=\"reference internal\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectFallbackMiddleware</span></code></a> à la fin de la liste, parce qu’il doit être appelé en dernier recours.</p>\n<p>Pour plus d’informations sur cet intergiciel, lisez la <a class=\"reference internal\" href=\"/fr/5.1/topics/http/middleware/\"><span class=\"doc\">documentation des intergiciels</span></a>.</p>\n</section>\n<section id=\"how-to-add-change-and-delete-redirects\">\n<h2>Ajout, modification et suppression des redirections<a class=\"heading-anchor\" href=\"#how-to-add-change-and-delete-redirects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"via-the-admin-interface\">\n<h3>Via l’interface d’administration<a class=\"heading-anchor\" href=\"#via-the-admin-interface\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>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.</p>\n</section>\n<section id=\"via-the-python-api\">\n<h3>Via l’API Python<a class=\"heading-anchor\" href=\"#via-the-python-api\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.redirects.models.Redirect\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">models.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Redirect</span></span><a class=\"heading-anchor\" href=\"#django.contrib.redirects.models.Redirect\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Les redirections sont représentées par un <a class=\"reference internal\" href=\"/fr/5.1/topics/db/models/\"><span class=\"doc\">modèle Django</span></a> standard, qui est défini dans <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.1.x/django/contrib/redirects/models.py\">django/contrib/redirects/models.py</a>. Vous pouvez accéder aux objets de redirection via <a class=\"reference internal\" href=\"/fr/5.1/topics/db/queries/\"><span class=\"doc\">l’API de base de données de Django</span></a>. Par exemple :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.redirects.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Redirect</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Add a new redirect.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">redirect</span> <span class=\"o\">=</span> <span class=\"n\">Redirect</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">site_id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">old_path</span><span class=\"o\">=</span><span class=\"s2\">&quot;/contact-us/&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"n\">new_path</span><span class=\"o\">=</span><span class=\"s2\">&quot;/contact/&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Change a redirect.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">redirect</span><span class=\"o\">.</span><span class=\"n\">new_path</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;/contact-details/&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">redirect</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">redirect</span>\n<span class=\"go\">&lt;Redirect: /contact-us/ ---&gt; /contact-details/&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Delete a redirect.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Redirect</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">site_id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"n\">old_path</span><span class=\"o\">=</span><span class=\"s2\">&quot;/contact-us/&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">()</span>\n<span class=\"go\">(1, {&#39;redirects.Redirect&#39;: 1})</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"middleware\">\n<h2>Intergiciels (« middleware »)<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">middleware.</span></span><span class=\"sig-name descname\"><span class=\"pre\">RedirectFallbackMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Vous pouvez modifier les classes <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> utilisées par l’intergiciel en créant une sous-classe de <a class=\"reference internal\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectFallbackMiddleware</span></code></a> et en surchargeant les attributs <code class=\"docutils literal notranslate\"><span class=\"pre\">response_gone_class</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">response_redirect_class</span></code>.</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_gone_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">response_gone_class</span></span><a class=\"heading-anchor\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_gone_class\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La classe <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> utilisée lorsqu’aucun <a class=\"reference internal\" href=\"#django.contrib.redirects.models.Redirect\" title=\"django.contrib.redirects.models.Redirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Redirect</span></code></a> n’est trouvé pour le chemin demandé ou qu’il possède une valeur vide pour <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code>.</p>\n<p>La valeur par défaut est <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponseGone\" title=\"django.http.HttpResponseGone\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseGone</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_redirect_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">response_redirect_class</span></span><a class=\"heading-anchor\" href=\"#django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_redirect_class\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La classe <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> qui se charge de la redirection.</p>\n<p>La valeur par défaut est <a class=\"reference internal\" href=\"/fr/5.1/ref/request-response/#django.http.HttpResponsePermanentRedirect\" title=\"django.http.HttpResponsePermanentRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponsePermanentRedirect</span></code></a>.</p>\n</dd></dl>\n\n</dd></dl>\n\n</section>","rootId":"module-django.contrib.redirects","toc":[{"title":"Installation","anchor":"installation","children":[]},{"title":"Fonctionnement","anchor":"how-it-works","children":[]},{"title":"Ajout, modification et suppression des redirections","anchor":"how-to-add-change-and-delete-redirects","children":[{"title":"Via l’interface d’administration","anchor":"via-the-admin-interface","children":[]},{"title":"Via l’API Python","anchor":"via-the-python-api","children":[]}]},{"title":"Intergiciels (« middleware »)","anchor":"middleware","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.1/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/5.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/postgres/validators","title":"Validateurs","url":"/fr/5.1/ref/contrib/postgres/validators/"},"next":{"docname":"ref/contrib/sitemaps","title":"Le système des plans de site (sitemap)","url":"/fr/5.1/ref/contrib/sitemaps/"},"formats":{"html":"/fr/5.1/ref/contrib/redirects/","markdown":"/fr/5.1/ref/contrib/redirects.md","json":"/fr/5.1/ref/contrib/redirects.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/ref/contrib/redirects.txt","official":"https://docs.djangoproject.com/fr/5.1/ref/contrib/redirects/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}