重定向应用

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

安装

要安装重定向应用,请按照以下步骤操作

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

  2. 'django.contrib.redirects' 添加到您的 INSTALLED_APPS 设置中。

  3. 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' 添加到您的 MIDDLEWARE 设置中。

  4. 运行命令 manage.py migrate

工作原理

manage.py migrate 在您的数据库中创建一个 django_redirect 表。这是一个查找表,包含 site_idold_pathnew_path 字段。

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

  • 如果找到匹配项,并且 new_path 不为空,则使用 301(“永久移动”)重定向到 new_path。您可以继承 RedirectFallbackMiddleware 并将 response_redirect_class 设置为 django.http.HttpResponseRedirect 以使用 302 Moved Temporarily 重定向。

  • 如果找到匹配项,并且 new_path 为空,则发送 410(“已消失”)HTTP 标头和空(无内容)响应。

  • 如果未找到匹配项,则照常继续处理请求。

中间件仅在发生 404 错误时激活 - 不会在发生 500 错误或任何其他状态代码的响应时激活。

请注意,MIDDLEWARE 的顺序很重要。通常,您可以将 RedirectFallbackMiddleware 放置在列表的末尾,因为它是一种最后手段。

有关中间件的更多信息,请阅读 中间件文档

如何添加、更改和删除重定向

通过管理界面

如果您已激活自动 Django 管理界面,则应在管理索引页面上看到“重定向”部分。您可以像编辑系统中的任何其他对象一样编辑重定向。

通过 Python API

class models.Redirect

重定向由一个标准的 Django 模型 表示,该模型位于 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

当未找到请求路径的 Redirect 或其 new_path 值为空时使用的 HttpResponse 类。

默认为 HttpResponseGone

response_redirect_class

处理重定向的 HttpResponse 类。

默认为 HttpResponsePermanentRedirect

返回顶部