{"title":"重定向应用","version":"6.1","locale":"zh-hans","docname":"ref/contrib/redirects","url":"/zh-hans/6.1/ref/contrib/redirects/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/contrib/redirects/","summary":"Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向，并为你处理重定向。它默认使用 HTTP 响应状态码 301 Moved Permanently 。 安装 Link to this heading # 要安装重定向应用程序，请按照这些步骤进行： 确保 django.contrib.sites 框架…","html":"<span id=\"the-redirects-app\"></span><h1>重定向应用<a class=\"heading-anchor\" href=\"#module-django.contrib.redirects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向，并为你处理重定向。它默认使用 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>安装<a class=\"heading-anchor\" href=\"#installation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>要安装重定向应用程序，请按照这些步骤进行：</p>\n<ol class=\"arabic simple\">\n<li><p>确保 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.sites</span></code> 框架 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/sites/#enabling-the-sites-framework\"><span class=\"std std-ref\">已安装</span></a>。</p></li>\n<li><p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.redirects'</span></code> 添加到你的 <a class=\"reference internal\" href=\"/zh-hans/6.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>在你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 配置中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.redirects.middleware.RedirectFallbackMiddleware'</span></code>。</p></li>\n<li><p>运行命令 <a class=\"reference internal\" href=\"/zh-hans/6.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>工作方式<a class=\"heading-anchor\" href=\"#how-it-works\"><span class=\"visually-hidden\">Link to this heading</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> 在数据库中创建一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">django_redirect</span></code> 表。这是一个有 <code class=\"docutils literal notranslate\"><span class=\"pre\">site_id</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">old_path</span></code> 和 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> 字段的查询表。</p>\n<p><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> 完成了所有的工作。每当任何 Django 应用出现 404 错误时，这个中间件都会检查重定向数据库中请求的 URL，作为最后的手段。具体来说，它检查给定的 <code class=\"docutils literal notranslate\"><span class=\"pre\">old_path</span></code> 与站点 ID 对应的 <a class=\"reference internal\" href=\"/zh-hans/6.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>如果它找到了一个匹配的对象，并且 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> 不是空的，它就会使用 301（“Moved Permanently”）重定向到 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code>。你可以将 <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> 子类化，并将 <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=\"/zh-hans/6.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> 以使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">302</span> <span class=\"pre\">Moved</span> <span class=\"pre\">Temporary</span></code> 重定向。</p></li>\n<li><p>如果它找到了一个匹配，并且 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> 是空的，它就会发送一个 410（“Gone”）HTTP 头和空的（无内容）响应。</p></li>\n<li><p>如果没有找到匹配的请求，则继续照常处理。</p></li>\n</ul>\n<p>中间件只有在 404 时才会被激活——而不是 500 或任何其他状态码的响应。</p>\n<p>注意 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 的顺序很重要。一般来说，你可以把 <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> 放在列表的最后，因为这是最后的手段。</p>\n<p>关于中间件的更多内容，请阅读 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/http/middleware/\"><span class=\"doc\">中间件文档</span></a>。</p>\n</section>\n<section id=\"how-to-add-change-and-delete-redirects\">\n<h2>如何添加、更改和删除重定向<a class=\"heading-anchor\" href=\"#how-to-add-change-and-delete-redirects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"via-the-admin-interface\">\n<h3>通过管理界面<a class=\"heading-anchor\" href=\"#via-the-admin-interface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>如果你已经激活了 Django 的自动管理界面，你应该会在管理索引页上看到“重定向”部分。像编辑系统中的其他对象一样编辑重定向。</p>\n</section>\n<section id=\"via-the-python-api\">\n<h3>通过 Python API<a class=\"heading-anchor\" href=\"#via-the-python-api\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>重定向由一个标准的 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/models/\"><span class=\"doc\">Django 模型</span></a> 表示，位于 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/contrib/redirects/models.py\">django/contrib/redirects/models.py</a> 中。您可以通过 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">Django 数据库 API</span></a> 访问重定向对象。例如：</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>中间件<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>你可以通过创建一个 <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> 的子类，并覆盖 <code class=\"docutils literal notranslate\"><span class=\"pre\">response_gone_class</span></code> 和／或 <code class=\"docutils literal notranslate\"><span class=\"pre\">response_redirect_class</span></code> 来改变中间件使用的 <a class=\"reference internal\" href=\"/zh-hans/6.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> 类。</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当在请求的路径上没有找到 <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> 或有一个空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">new_path</span></code> 值时使用的 <a class=\"reference internal\" href=\"/zh-hans/6.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> 类。</p>\n<p>默认为 <a class=\"reference internal\" href=\"/zh-hans/6.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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>处理重定向的 <a class=\"reference internal\" href=\"/zh-hans/6.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> 类。</p>\n<p>默认为 <a class=\"reference internal\" href=\"/zh-hans/6.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":"安装","anchor":"installation","children":[]},{"title":"工作方式","anchor":"how-it-works","children":[]},{"title":"如何添加、更改和删除重定向","anchor":"how-to-add-change-and-delete-redirects","children":[{"title":"通过管理界面","anchor":"via-the-admin-interface","children":[]},{"title":"通过 Python API","anchor":"via-the-python-api","children":[]}]},{"title":"中间件","anchor":"middleware","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.1/ref/contrib/"}],"prev":{"docname":"ref/contrib/postgres/validators","title":"验证器","url":"/zh-hans/6.1/ref/contrib/postgres/validators/"},"next":{"docname":"ref/contrib/sitemaps","title":"站点地图框架","url":"/zh-hans/6.1/ref/contrib/sitemaps/"},"formats":{"html":"/zh-hans/6.1/ref/contrib/redirects/","markdown":"/zh-hans/6.1/ref/contrib/redirects.md","json":"/zh-hans/6.1/ref/contrib/redirects.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/redirects.txt","official":"https://docs.djangoproject.com/zh-hans/6.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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}