# Django 3.2.11.dev 文档

# 重定向应用

Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向，并为你处理重定向。它默认使用 HTTP 响应状态码 `301 Moved Permanently`。

## 安装

要安装重定向应用程序，请按照这些步骤进行：

1. 确保 `django.contrib.sites` 框架 已安装。
2. 将 `'django.contrib.redirects'` 添加到你的 `INSTALLED_APPS` 配置中。
3. 在你的 `MIDDLEWARE` 配置中添加 `'django.contrib.redirects.middleware.RedirectFallbackMiddleware'`。
4. 运行命令 `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` 类。

    默认为 `HttpResponsePermanentRedirect`。