Spec-Zone.ru › Django 1.11

Создание представлений

Функция представления, или коротко представление, — это просто функция 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, а также библиотеку Python datetime.
  • Далее, мы определяем функцию с именем 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 (что означает «ОК»). Полный список доступных подклассов можно найти в документации запрос/ответ. Просто верните экземпляр одного из этих подклассов вместо обычного объекта 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/1.11/topics/http/views/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API