Функция представления, или коротко представление – это функция Python, которая принимает Web-запрос и возвращает Web-ответ. Ответом может быть HTML-содержимое страницы, или перенаправление, или 404 ошибка, или XML-документ, или изображение . . . что угодно. Представление содержит всю необходимую логику для создания ответа. Этот код может находиться где угодно, главное что бы он находился в PYTHON_PATH. Никаких других требований нет – никакой “магии”. Несмотря на возможность расположить код представлений где угодно, принято держать его в файле 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 и библиотеку Python datetime.
Теперь определим функцияю current_datetime. Это функция представления. Каждая функция представления принимает объект HttpRequest первым аргументом, который обычно называют request.
Название функции может быть каким угодно, нет никаких конкретных правил для именования. Мы назвали функцию current_datetime.
Представление возвращает объект HttpResponse, который содержит сгенерированный ответ. Каждая функция представления должна возвращать объект HttpResponse. (Есть исключения, но мы расскажем об этом далее.)
Django’s Time Zone
Django содержит настройку TIME_ZONE равную по-умолчанию America/Chicago. Возможно это не там, где вы живете, вы можете изменить эту настройку в файле настройки.
Итак, напомним, функция представления возвращает HTML-страницу, которая содержит текущую дату и время. Что бы привязать это представление к определенному URL-у, необходимо создать URLconf; подробности смотрите в разделе Менеджер URL-ов.
Возвращение HTTP ошибок в Django очень просто. Существует ряд подклассов HttpResponse для распространенных HTTP-состояний отличных от 200 (что означает “OK”). Вы можете посмотреть полный список доступных подклассов в разделе о HTTP запросах и ответах. Просто верните экземпляр необходимого подкласса вместо HttpResponse. Например:
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. Например:
def my_view(request):
# ...
# Return a "created" (201) response code.
return HttpResponse(status=201)
Так как ошибка 404 самая используемая HTTP-ошибка, существует простой способ работы с такими ошибками.
Если вы возвращаете ошибку HttpResponseNotFound, вы должны добавить HTML содержимое страницы с ошибкой:
return HttpResponseNotFound('<h1>Page not found</h1>')
Для удобства и что бы все страницы для ошибки 404 выглядели одинаково, Django предоставляет исключение Http404. Если вы вызываете исключение Http404 в любой момент обработки запроса, Django перехватит его и вернет стандартную страницу 404 ошибки вашего проекта, вместе с 404 кодом состояния HTTP.
Пример использования:
from django.http import Http404
def detail(request, poll_id):
try:
p = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render_to_response('polls/detail.html', {'poll': p})
Что бы использовать Http404 исключение, вам необходимо создать шаблон для станицы с ошибкой. Этот шаблон должен называться 404.html и находиться в корневом каталоге шаблонов.
Когда вы вызываете Http404 исключение, Django загрузить специальное представление, назначение которого обрабатывать 404 ошибку. По-умолчанию, это функция django.views.defaults.page_not_found, которая загружает и выполняет шаблон 404.html.
Это означает, что вы должны создать шаблон 404.html в корневом каталоге шаблонов. Этот шаблон будет использоваться для всех 404 ошибок. Представление для обработки 404 ошибки передает в шаблон одну переменную: request_path, значение которой URL вернувший ошибку.
Представления page_not_found хватит для 99% Web-приложений, но если вы хотите переопределить его, добавьте функцию handler404 в URLconf, например:
handler404 = 'mysite.views.my_custom_404_view'
При 404 ошибке Django ищет функцию handler404 в URLconf, если она не найден - использует django.views.defaults.page_not_found.
Четыре вещи, которые необходимо знать о представлении обрабатывающем 404 ошибку:
404-представление вызывается, если Django не находит подходящего URL-шаблона в URLconf.
Если вы не переопределяете представление для обработки 404 ошибки — вы все равно должны создать шаблон 404.html в корневом каталоге шаблонов.
Представление обрабатывающее 404 ошибку использует RequestContext и в шаблоне будут доступные все переменные добавленные процессорами контекста из настройки TEMPLATE_CONTEXT_PROCESSORS (например, MEDIA_URL).
Если DEBUG установлен в True (в настройках проекта), представление для обработки 404 ошибки никогда не будет использовано, и будет показан URLconf с отладочной информацией.
Кроме того, Django вызывает определенный обработчик и при исключении в коде. Если представление вызовет исключение, Django по-умолчанию вызовет представление django.views.defaults.server_error, которое загрузит и вернет шаблон 500.html.
Это означает что вы должны создать шаблон 500.html в корневом каталоге шаблонов. Этот шаблон будет использоваться при всех ошибках сервера. Представление обрабатывающее ошибку 500 не передает переменных в шаблон и использует Context что бы избежать дополнительных ошибок.
Представления server_error хватит для 99% Web-приложений, но если вы хотите переопределить его, добавьте функцию handler500 в URLconf, например:
handler500 = 'mysite.views.my_custom_error_view'
При 500 ошибке Django ищет функцию handler500 в URLconf, если она не найден - использует django.views.defaults.server_error.
Две вещи, которые необходимо знать о представлении обрабатывающем 500 ошибку:
Если вы не переопределяете представление для обработки 500 ошибки — вы все равно должны создать шаблон 500.html в корневом каталоге шаблонов.
Если DEBUG установлен в True (в настройках проекта), представление для обработки 500 ошибки никогда не будет использовано, и будет показан стек вызовов с отладочной информацией.
Как и для 404 и 500 ошибок, Django вызывает представление для обработки 403 ошибки. Если представление вызовет 403 исключение, Django по-умолчанию выполнит представление django.views.defaults.permission_denied.
Это представление загружает и выполняет шаблон 403.html из корневом каталоге шаблонов, или, если он не существует, вернет текст “403 Forbidden”, в соответствии с RFC 2616 (спецификация HTTP 1.1).
Как и для 404 и 500 ошибок, вы можете переопределить django.views.defaults.permission_denied указав функцию handler403 в URLconf:
handler403 = 'mysite.views.my_custom_permission_denied_view'
Mar 30, 2016