Перенаправление (Redirect) в контексте веб-разработки означает отправку клиента на другую страницу после того, как он сделал запрос к текущей странице. Это может быть полезно в различных сценариях, таких как перенаправление пользователя после успешной отправки формы, перенаправление с некорректного URL на правильный, или перенаправление пользователя после успешной аутентификации.
HttpResponseRedirect
и HttpResponsePermanentRedirect
- это два класса-наследника от класса HttpResponse
. Они используются в Django для выполнения HTTP-перенаправлений.
HttpResponseRedirect:
Этот класс используется для временного перенаправления (код состояния HTTP 302).
Для создания объекта этого класса должен быть передан один обязательный аргумент redirect_to
. Этот аргумент должен быть строкой, содержащей URL, на который будет выполнено перенаправление. URL адрес будет сохранён в атрибут объекта Location
.
При отправке этого ответа браузер клиента будет автоматически переходить на указанный URL.
Пример использования:
from django.http import HttpResponseRedirect
redirect = HttpResponseRedirect('/new_page/')
HttpResponsePermanentRedirect:
Этот класс используется для постоянного перенаправления (код состояния HTTP 301).
Создаётся аналогично объекту HttpResponseRedirect
передачей обязательного аргумента - URL в формате строки, который сохраняется в атрибут Location
.
Пример использования:
from django.http import HttpResponsePermanentRedirect
permanent_redirect = HttpResponsePermanentRedirect('/new_page/')
<aside> ⛔ В приведенных выше примерах URL-адреса перенаправления жестко закодированы. Хардкодинг URL-адресов - плохая практика: если URL-адрес когда-либо изменится, вам придется выполнить поиск по всему коду и изменить все вхождения.
</aside>
Функция redirect()
в Django используется для выполнения перенаправления пользователя на другую страницу.
Она самостоятельно вызывает определённые методы и функции, чтобы преобразовать аргументы в URL и вернуть экземпляр HttpResponseRedirect
(по умолчанию) или HttpResponsePermanentRedirect
, если будет задан аргумент permanent=True
. Импортируется из модуля - django.shortcuts
Синтаксис:
**from django.shortcuts import redirect**
def view(request):
return redirect(to, *args, permanent=False, **kwargs)
Параметры:
to
является обязательным и принимает различные типы аргументов, позволяющие задать путь для перенаправления:
Здесь может быть указан URL-адрес (как абсолютный, так и относительный). Например,
from django.shortcuts import redirect
#Абсолютный URL
def view(request):
return redirect(**'<https://example.com/new_page/>'**)
****#Абсолютный URL внутри текущего домена.
def view2(request):
return redirect(**'/path/to/redirect/'**)
#Относительный URL внутри текущего домена.
def view2(request):
return redirect(**'add/this/'**)
Важно!
/
, что указывает на корень текущего домена. Django будет выполнять перенаправление на конкретную страницу внутри текущего домена.redirect('/path/to/redirect/')
отправит пользователя на страницу с URL https://example.com/path/to/redirect/
./
и представляет собой относительный путь относительно текущей страницы.redirect('add/this/')
отправит пользователя на страницу с URL, построенным относительно текущего URL, например, если текущий URL https://example.com/somepage/
, то пользователь будет перенаправлен на https://example.com/somepage/add/this/
.Также здесь может быть указано имя url-маршрута. Например:
from django.shortcuts import redirect
# без аргументов
# перенаправление на адрес домашней страницы <http://127.0.0.1:8000/>
def view(request):
return redirect(**'home'**)
****# c позиционными аргументами
# перенаправление на адрес: <http://127.0.0.1:8000/archive/2022/10/>
def view2(request):
return redirect(**'archive', '2022', '10'**)
# с именовами аргументами
# перенаправление на адрес: <http://127.0.0.1:8000/archive/2022/10/>
def view2(request):
return redirect(**'archive', month='10', year='2022'**)
В данном случае генерация url маршрута происходит путём вызова функций resolve_url
и reverse
внутри Django.
В качестве пути может быть указано и название представления, вызов которого будет использован для перенаправления. При чём аргументы для этого представления могут быть переданы позиционными или именованными параметрами в функцию redirect. Например:
def posts(request, month, year):
if year < 2022:
return redirect(archive, **year, month**)
return HttpResponse(f'Посты за {month} месяц и {year} год')
Этот способ также отрабатывает за счёт вызова resolve_url
и reverse
.
Экземпляр модели или любой другой объект с поддержкой метода get_absolute_url()
*мы ещё не проходили модели, поэтому этот пункт я пока оставлю без более подробного описания.
to
является именем маршрута или названием представления.Пример использования:
from django.shortcuts import redirect
def my_view(request):
# Проверяем, авторизован ли пользователь
if not request.user.is_authenticated:
# Если не авторизован, перенаправляем на страницу входа
return redirect('/accounts/login/')
**** else:
# Если авторизован, отображаем нужную страницу
return render(request, 'my_template.html', context)
В этом примере, если пользователь не авторизован, функция my_view()
выполнит перенаправление на страницу входа. Если пользователь авторизован, будет отображена страница my_template.html
.
Функция reverse()
используется для генерации URL-адреса на основе имени маршрута или названия представления. Она возвращает строку, представляющую сгенерированный URL-адрес. Импортируется из модуля django.urls
Синтаксис: