Spec-Zone.ru › Django 1.10

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

Функция представления, или коротко представление, — это просто функция 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 (что означает «Всё в порядке»). Полный список доступных подклассов можно найти в документации request/response. Просто верните экземпляр одного из этих подклассов вместо обычного объекта 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.10/topics/http/views/

Spec-Zone.ru

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