重定向应用Link to this heading

Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向,并为你处理重定向。它默认使用 HTTP 响应状态码 301 Moved Permanently

安装Link to this heading

要安装重定向应用程序,请按照这些步骤进行:

  1. 确保 django.contrib.sites 框架 已安装

  2. 'django.contrib.redirects' 添加到你的 INSTALLED_APPS 配置中。

  3. 在你的 MIDDLEWARE 配置中添加 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'

  4. 运行命令 manage.py migrate

工作方式Link to this heading

manage.py migrate 在数据库中创建一个 django_redirect 表。这是一个有 site_idold_pathnew_path 字段的查询表。

RedirectFallbackMiddleware 完成了所有的工作。每当任何 Django 应用出现 404 错误时,这个中间件都会检查重定向数据库中请求的 URL,作为最后的手段。具体来说,它检查给定的 old_path 与站点 ID 对应的 SITE_ID 设置的重定向。

  • 如果它找到了一个匹配的对象,并且 new_path 不是空的,它就会使用 301(“Moved Permanently”)重定向到 new_path。你可以将 RedirectFallbackMiddleware 子类化,并将 response_redirect_class 设置为 django.http.HttpResponseRedirect 以使用 302 Moved Temporary 重定向。

  • 如果它找到了一个匹配,并且 new_path 是空的,它就会发送一个 410(“Gone”)HTTP 头和空的(无内容)响应。

  • 如果没有找到匹配的请求,则继续照常处理。

中间件只有在 404 时才会被激活——而不是 500 或任何其他状态码的响应。

注意 MIDDLEWARE 的顺序很重要。一般来说,你可以把 RedirectFallbackMiddleware 放在列表的最后,因为这是最后的手段。

关于中间件的更多内容,请阅读 中间件文档

如何添加、更改和删除重定向Link to this heading

通过管理界面Link to this heading

如果你已经激活了 Django 的自动管理界面,你应该会在管理索引页上看到“重定向”部分。像编辑系统中的其他对象一样编辑重定向。

通过 Python APILink to this heading

class models.RedirectLink to this definition

重定向由一个标准的 Django 模型 来表示,它位于 django/contrib/redirects/models.py 中。你可以通过 Django 数据库 API 来访问重定向对象。例如:

Code
>>> 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})

中间件Link to this heading

class middleware.RedirectFallbackMiddlewareLink to this definition

你可以通过创建一个 RedirectFallbackMiddleware 的子类,并覆盖 response_gone_class 和/或 response_redirect_class 来改变中间件使用的 HttpResponse 类。

response_gone_classLink to this definition

当在请求的路径上没有找到 Redirect 或有一个空的 new_path 值时使用的 HttpResponse 类。

默认为 HttpResponseGone

response_redirect_classLink to this definition

处理重定向的 HttpResponse 类。

默认为 HttpResponsePermanentRedirect