Создание представлений
Функция представления, или представление коротко, — это просто функция 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'
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/topics/http/views/