重定向应用程序 — Django 文档
重定向应用
Django 带有一个可选的重定向应用程序。 它允许您将重定向存储在数据库中并为您处理重定向。 它默认使用 HTTP 响应状态代码 301 Moved Permanently
。
安装
要安装重定向应用程序,请按照下列步骤操作:
- 确保已安装
django.contrib.sites
框架 [[Django/docs/3.2.x/ref/contrib/sites#enabling-the-sites-framework|]]。 - 将
'django.contrib.redirects'
添加到您的 :setting:`INSTALLED_APPS` 设置。 - 将
'django.contrib.redirects.middleware.RedirectFallbackMiddleware'
添加到您的 :setting:`MIDDLEWARE` 设置。 - 运行命令 :djadmin:`manage.py 迁移 ` .
工作原理
manage.py migrate
在您的数据库中创建一个 django_redirect
表。 这是一个包含 site_id
、old_path
和 new_path
字段的查找表。
RedirectFallbackMiddleware 完成所有工作。 每次任何 Django 应用程序引发 404 错误时,该中间件都会检查重定向数据库以查找所请求的 URL 作为最后的手段。 具体来说,它检查具有给定 old_path
的重定向,其站点 ID 对应于 :setting:`SITE_ID` 设置。
- 如果找到匹配项,并且
new_path
不为空,则使用 301(“永久移动”)重定向重定向到new_path
。 您可以将 RedirectFallbackMiddleware 子类化并将 response_redirect_class 设置为 django.http.HttpResponseRedirect 以使用302 Moved Temporarily
重定向。 - 如果找到匹配项,并且
new_path
为空,则发送 410(“Gone”)HTTP 标头和空(无内容)响应。 - 如果未找到匹配项,则继续照常处理请求。
中间件仅在 404 秒内被激活——而不是 500 秒或任何其他状态代码的响应。
注意 :setting:`MIDDLEWARE` 的顺序很重要。 通常,您可以将 RedirectFallbackMiddleware 放在列表的末尾,因为这是最后的手段。
有关中间件的更多信息,请阅读 中间件文档 。
如何添加、更改和删除重定向
通过管理界面
如果您已激活自动 Django 管理界面,您应该会在管理索引页面上看到“重定向”部分。 在编辑系统中的任何其他对象时编辑重定向。
通过 Python API
- class models.Redirect
重定向由标准的 Django 模型 表示,该模型位于 :source:`django/contrib/redirects/models.py`。 您可以通过 Django 数据库 API 访问重定向对象。 例如:
>>> 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})
中间件
- class middleware.RedirectFallbackMiddleware
您可以通过创建 RedirectFallbackMiddleware 的子类并覆盖
response_gone_class
和/或response_redirect_class
来更改中间件使用的 HttpResponse 类。- response_gone_class
HttpResponse 类在未找到所请求路径的 Redirect 或具有空白
new_path
值时使用。默认为 HttpResponseGone。
- response_redirect_class
处理重定向的 HttpResponse 类。