重定向应用¶
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 的自动管理界面,你应该会在管理索引页上看到“重定向”部分。像编辑系统中的其他对象一样编辑重定向。
通过 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类。
 
- 
 
          