Создание представлений
Функция представления, или представление вкратце, — это просто функция Python, которая принимает веб-запрос и возвращает веб-ответ. Этот ответ может быть HTML-содержимым веб-страницы, перенаправлением, ошибкой 404, XML-документом, изображением… или чем угодно. Само представление содержит необходимую произвольную логику для возвращения этого ответа. Этот код может находиться где угодно, при условии, что он находится на вашем пути Python. Нет никаких других требований — нет никакой «магии», так сказать. Ради размещения кода где-то, принято размещать представления в файле с именем views.py, размещённом в вашей директории проекта или приложения.
Простое представление
Вот представление, которое возвращает текущую дату и время в виде HTML-документа:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
Давайте пошагово пройдёмся по этому коду:
- Сначала мы импортируем класс
HttpResponseиз модуляdjango.http, а также библиотеку Pythondatetime. -
Далее, мы определяем функцию с именем
current_datetime. Это функция представления. Каждая функция представления принимает объектHttpRequestв качестве своего первого параметра, который обычно называетсяrequest.Обратите внимание, что имя функции представления не имеет значения; Django не требует определенного имени для его распознавания. Мы называем его
current_datetimeздесь, потому что это имя ясно указывает на его назначение. - Представление возвращает объект
HttpResponse, содержащий сгенерированный ответ. Каждая функция представления отвечает за возвращение объектаHttpResponse. (Есть исключения, но мы рассмотрим их позже.)
Временная зона Django
Django включает настройку TIME_ZONE, которая по умолчанию равна America/Chicago. Вероятно, это не ваша местная временная зона, поэтому вам может потребоваться изменить её в файле настроек.
Сопоставление URL-адресов с представлениями
Итак, подытожив, эта функция представления возвращает HTML-страницу, содержащую текущую дату и время. Чтобы отобразить это представление по определённому URL-адресу, вам нужно создать URLconf; см. Диспечер URL для получения инструкций.
Возврат ошибок
Возвращение кодов ошибок HTTP в Django просто. Существуют подклассы HttpResponse для ряда распространённых кодов статуса HTTP помимо 200 (что означает «OK»). Полный список доступных подклассов можно найти в документации запрос/ответ. Просто верните экземпляр одного из этих подклассов вместо обычного HttpResponse, чтобы указать ошибку. Например:
from django.http import HttpResponse, HttpResponseNotFound
def my_view(request):
# ...
if foo:
return HttpResponseNotFound('<h1>Page not found</h1>')
else:
return HttpResponse('<h1>Page was found</h1>')
Не существует специализированного подкласса для каждого возможного кода ответа HTTP, так как многие из них не являются распространёнными. Однако, как описано в документации HttpResponse, вы также можете передать код статуса HTTP в конструктор HttpResponse, чтобы создать возвращаемый класс для любого кода статуса, который вам нужен. Например:
from django.http import HttpResponse
def my_view(request):
# ...
# Return a "created" (201) response code.
return HttpResponse(status=201)
Так как ошибки 404 являются наиболее распространёнными ошибками HTTP, существует более простой способ их обработки.
Исключение Http404
-
class django.http.Http404
Когда вы возвращаете ошибку, такую как HttpResponseNotFound, вам нужно определить HTML для отображаемой страницы ошибки:
return HttpResponseNotFound('<h1>Page not found</h1>')
Для удобства и потому, что хорошая идея иметь согласованную страницу 404 на вашем сайте, Django предоставляет исключение Http404. Если вы поднимите Http404 в любой точке функции представления, Django перехватит его и вернёт стандартную страницу ошибки для вашего приложения, а также HTTP-код ошибки 404.
Пример использования:
from django.http import Http404
from django.shortcuts import render
from polls.models import Poll
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404("Poll does not exist")
return render(request, 'polls/detail.html', {'poll': p})
Чтобы показать настраиваемый HTML, когда Django возвращает 404, вы можете создать HTML-шаблон с именем 404.html и разместить его в корневой директории дерева ваших шаблонов. Этот шаблон будет затем отображаться, когда DEBUG установлен в False.
Когда DEBUG равен True, вы можете предоставить сообщение для Http404 , и оно отобразится в стандартном шаблоне 404 отладки. Используйте эти сообщения для отладки; они обычно не подходят для использования в шаблоне 404 в рабочей среде.
Настройка представлений ошибок
По умолчанию представления ошибок Django подходят для большинства веб-приложений, но их можно легко переопределить, если вам нужно любое пользовательское поведение. Просто укажите обработчики, как показано ниже, в своём URLconf (установка их где-либо ещё не повлияет).
Представление page_not_found() переопределяется handler404:
handler404 = 'mysite.views.my_custom_page_not_found_view'
Представление server_error() переопределяется handler500:
handler500 = 'mysite.views.my_custom_error_view'
Представление permission_denied() переопределяется handler403:
handler403 = 'mysite.views.my_custom_permission_denied_view'
Представление bad_request() переопределяется handler400:
handler400 = 'mysite.views.my_custom_bad_request_view'
См. также
Используйте настройку CSRF_FAILURE_VIEW для переопределения представления ошибки CSRF.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.0/topics/http/views/