При перемещении документа с одного адреса на другой мы можем воспользоваться механизмом переадресации, чтобы указать пользователям и поисковику, что документу теперь доступен по новому адресу.
Переадресация бывает временная и постоянная. При временной переадресации мы указываем, что документ временно перемещен на новый адрес. В этом случае в ответ отправляется статусный код 302. При постоянной переадресации мы уведомляем, что документ теперь постоянно будет достуен по новому адресу
Для создания временной переадресации применяется класс HttpResponseRedirect, а для постоянной - класс HttpResponsePermanentRedirect, которые расположены в пакете django.http.
Так, определим в файле views.py следующий код:
from django.http import HttpResponse, HttpResponseRedirect, HttpResponsePermanentRedirect def index(request): return HttpResponse("Index") def about(request): return HttpResponse("About") def contact(request): return HttpResponseRedirect("/about") def details(request): return HttpResponsePermanentRedirect("/")
При обращении к функции contact
она будет перенаправлять по пути "about", который будет обрабатываться функцией about
.
А функция details
будет использовать постоянную переадресацию и перенаправлять на корень веб-приложения.
И также в файле urls.py для тестирования определим следующие маршруты:
from django.urls import path from hello import views urlpatterns = [ path("", views.index), path("about/", views.about), path("contact/", views.contact), path("details/", views.details), ]
Также в пакете django.http есть ряд классов, которые позволяют отправлять определенный статусный код:
Статусный код | Класс |
304 (Not Modified) | HttpResponseNotModified |
400 (Bad Request) | HttpResponseBadRequest |
403 (Forbidden) | HttpResponseForbidden |
404 (Not Found) | HttpResponseNotFound |
405 (Method Not Allowed) | HttpResponseNotAllowed |
410 (Gone) | HttpResponseGone |
500 (Internal Server Error) | HttpResponseServerError |
В функцию конструктора этих классов можно передать некоторые данные, например, сообщение об ошибке, которое увидит пользователь:
HttpResponseNotModified() HttpResponseBadRequest("Bad Request") HttpResponseForbidden("Forbidden") HttpResponseNotFound("Not Found") HttpResponseNotAllowed("Method is not allowed") HttpResponseGone("Content is no longer here") HttpResponseServerError("Server Error")
Например, определим следующий файл views.py:
from django.http import HttpResponse, HttpResponseNotFound, HttpResponseForbidden, HttpResponseBadRequest def index(request, id): people = ["Tom", "Bob", "Sam"] # если пользователь найден, возвращаем его if id in range(0, len(people)): return HttpResponse(people[id]) # если нет, то возвращаем ошибку 404 else: return HttpResponseNotFound("Not Found") def access(request, age): # если возраст НЕ входит в диапазон 1-110, посылаем ошибку 400 if age not in range(1, 111): return HttpResponseBadRequest("Некорректные данные") # если возраст больше 17, то доступ разрешен if(age > 17): return HttpResponse("Доступ разрешен") # если нет, то возвращаем ошибку 403 else: return HttpResponseForbidden("Доступ заблокирован: недостаточно лет")
Функция index принимает параметр id. Это будет индекс элемента в списке people. Однако пользователь может передать и недействительный индекс, например, 100, хотя в примере в списке только 3 элемента. Поэтому, если передан действительный индекс, то возвращаем элемент по этому индексу. Если же индекс нейдествителен, то с помощью класса HttpResponseNotFound возвращаем ошибку 404 и сообщение об ошибке.
Аналогично функция access принимает параметр age, который представляет условный возвраст пользователя. Если возраст выходит за некоторые разумные пределы (1-110), то с помощью класса HttpResponseBadRequest возвращаем ошибку 400. Если возраст укладывается в эти рамки, но он меньше 18, то с помощью класса HttpResponseForbidden возвращаем ошибку 403 о том, что доступ запрещен.
Для теста в файле urls.py определим следующие маршруты:
from django.urls import path from hello import views urlpatterns = [ path("index/<int:id>", views.index), path("access/<int:age>", views.access), ]
Обратися к функции index, передав для параметра id корректные и некорректные значения. И в зависимости от значения параметра мы увидим либо данные из списка people, либо ошибку 404:
Аналогично при обращении по адресу "/access" в зависимости от значения параметра age мы увидим либо сообщения об ошибке, либо обычное сообщение:
Стоит отметить, что статусные сообщения об ошибках также отображаются в консоль запущенного приложения: