Приложение для перенаправления¶
Django поставляется с дополнительным приложением для перенаправления. Оно позволяет хранить перенаправления в базе данных и выполняет перенаправление за вас. По умолчанию оно использует код статуса ответа HTTP 301 Moved Permanently.
Установка¶
Чтобы установить приложение «Перенаправления», выполните следующие действия:
- Убедитесь, что рамки
django.contrib.sitesis installed. - Добавьте
'django.contrib.redirects'к настройкеINSTALLED_APPS. - Добавьте
'django.contrib.redirects.middleware.RedirectFallbackMiddleware'к настройкеMIDDLEWARE. - Выполните команду
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.
-