重定向应用程序 — Django 文档

来自菜鸟教程
Django/docs/3.1.x/ref/contrib/redirects
跳转至:导航、​搜索

重定向应用

Django 带有一个可选的重定向应用程序。 它允许您将重定向存储在数据库中并为您处理重定向。 它默认使用 HTTP 响应状态代码 301 Moved Permanently

安装

要安装重定向应用程序,请按照下列步骤操作:

  1. 确保已安装 django.contrib.sites 框架 [[Django/docs/3.1.x/ref/contrib/sites#enabling-the-sites-framework|]]。
  2. 'django.contrib.redirects' 添加到您的 :setting:`INSTALLED_APPS` 设置。
  3. 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' 添加到您的 :setting:`MIDDLEWARE` 设置。
  4. 运行命令 :djadmin:`manage.py 迁移 ` .


工作原理

manage.py migrate 在您的数据库中创建一个 django_redirect 表。 这是一个包含 site_idold_pathnew_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 类。

默认为 HttpResponsePermanentRedirect