Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向,并为你处理重定向。它默认使用 HTTP 响应状态码 301 Moved Permanently
。
要安装重定向应用程序,请按照这些步骤进行:
django.contrib.sites
框架 已安装。'django.contrib.redirects'
添加到你的 INSTALLED_APPS
配置中。MIDDLEWARE
配置中添加 'django.contrib.redirects.middleware.RedirectFallbackMiddleware'
。manage.py migrate
。manage.py migrate
在数据库中创建一个 django_redirect
表。这是一个有 site_id
、old_path
和 new_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
放在列表的最后,因为这是最后的手段。
关于中间件的更多内容,请阅读 中间件文档。
如果你已经激活了 Django 的自动管理界面,你应该会在管理索引页上看到“重定向”部分。像编辑系统中的其他对象一样编辑重定向。
models.
Redirect
¶Redirects are represented by a standard Django model, which lives in django/contrib/redirects/models.py. You can access redirect objects via the Django database API. For example:
>>> 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})
middleware.
RedirectFallbackMiddleware
¶你可以通过创建一个 RedirectFallbackMiddleware
的子类,并覆盖 response_gone_class
和/或 response_redirect_class
来改变中间件使用的 HttpResponse
类。
response_gone_class
¶当在请求的路径上没有找到 Redirect
或有一个空的 new_path
值时使用的 HttpResponse
类。
默认为 HttpResponseGone
。
response_redirect_class
¶处理重定向的 HttpResponse
类。
5月 12, 2023