Spec-Zone.ru › Django 1.9

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

Функция представления, или представление коротко, — это просто функция 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 (что означает «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/

Spec-Zone.ru

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