• en
  • Язык: ru

Приложение для перенаправления

Django поставляется с дополнительным приложением для перенаправления. Оно позволяет хранить перенаправления в базе данных и выполняет перенаправление за вас. По умолчанию оно использует код статуса ответа HTTP 301 Moved Permanently.

Установка

Чтобы установить приложение «Перенаправления», выполните следующие действия:

  1. Убедитесь, что рамки django.contrib.sites is installed.
  2. Добавьте 'django.contrib.redirects' к настройке INSTALLED_APPS.
  3. Добавьте 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' к настройке MIDDLEWARE.
  4. Выполните команду manage.py migrate.

Как это работает

manage.py migrate создает таблицу django_redirect в вашей базе данных. Это таблица поиска с полями site_id, old_path и new_path.

Всю работу выполняет RedirectFallbackMiddleware. Каждый раз, когда любое приложение Django выдает ошибку 404, это промежуточное ПО проверяет базу данных перенаправлений на наличие запрашиваемого URL в качестве последнего средства. В частности, он проверяет наличие перенаправления с заданным old_path с идентификатором сайта, который соответствует настройке SITE_ID.

  • Если он находит совпадение, и new_path не пуст, он перенаправляет на new_path, используя 301 («Moved Permanently») перенаправление. Вы можете подклассифицировать RedirectFallbackMiddleware и установить response_redirect_class в django.http.HttpResponseRedirect, чтобы вместо этого использовать перенаправление 302 Moved Temporarily.
  • Если он находит совпадение, а new_path пуст, он отправляет HTTP-заголовок 410 («Исчез») и пустой (content-less) ответ.
  • Если он не находит совпадения, запрос продолжает обрабатываться как обычно.

Промежуточное ПО активируется только для 404 - не для 500 или ответов с любым другим кодом состояния.

Обратите внимание, что порядок MIDDLEWARE имеет значение. Вообще, RedirectFallbackMiddleware можно поставить в конец списка, потому что это крайняя мера.

Подробнее о промежуточном программном обеспечении читайте в middleware docs.

Как добавлять, изменять и удалять перенаправления

Через интерфейс администратора

Если вы активировали автоматический интерфейс администратора Django, вы должны увидеть раздел «Перенаправления» на индексной странице администратора. Редактируйте перенаправления, как вы редактируете любой другой объект в системе.

Через API Python

class models.Redirect

Перенаправления представлены стандартным Django model, который живет в django/contrib/redirects/models.py. Вы можете получить доступ к объектам перенаправления через Django database 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})

Middleware

class middleware.RedirectFallbackMiddleware

Вы можете изменить классы HttpResponse, используемые промежуточным ПО, создав подкласс RedirectFallbackMiddleware и переопределив response_gone_class и/или response_redirect_class.

response_gone_class

Класс HttpResponse используется, когда Redirect не найден для запрашиваемого пути или имеет пустое значение new_path.

По умолчанию имеет значение HttpResponseGone.

response_redirect_class

Класс HttpResponse, который обрабатывает перенаправление.

По умолчанию имеет значение HttpResponsePermanentRedirect.

Вернуться на верх