重定向应用Link to this heading
Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向,并为你处理重定向。它默认使用 HTTP 响应状态码 301 Moved Permanently。
安装Link to this heading
要安装重定向应用程序,请按照这些步骤进行:
确保
django.contrib.sites框架 已安装。将
'django.contrib.redirects'添加到你的INSTALLED_APPS配置中。在你的
MIDDLEWARE配置中添加'django.contrib.redirects.middleware.RedirectFallbackMiddleware'。运行命令
manage.py migrate。
工作方式Link to this heading
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 放在列表的最后,因为这是最后的手段。
关于中间件的更多内容,请阅读 中间件文档。
如何添加、更改和删除重定向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 访问重定向对象。例如:
>>> 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类。