Spec-Zone.ru › Django 6.0

Встроенные представления

Несколько встроенных представлений Django описаны в разделе Написание представлений, а также в других разделах документации.

Раздача файлов в режиме разработки

static.serve(request, path, document_root, show_indexes=False)

Помимо статических ресурсов проекта, могут быть и другие файлы, которые для удобства вы хотели бы раздавать с помощью Django при локальной разработке. Представление serve() можно использовать для раздачи любого указанного вами каталога. (Это представление не защищено для использования в рабочей среде, поэтому его следует применять только в качестве вспомогательного средства при разработке; в рабочей среде эти файлы следует раздавать с помощью настоящего веб-сервера.)

Наиболее вероятный пример — загруженный пользователями контент в MEDIA_ROOT. django.contrib.staticfiles предназначен для статических ресурсов и не имеет встроенных средств обработки загруженных пользователями файлов, но вы можете поручить Django раздавать содержимое MEDIA_ROOT, добавив в URLconf что-нибудь вроде следующего:

from django.conf import settings
from django.urls import re_path
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        re_path(
            r"^media/(?P<path>.*)$",
            serve,
            {
                "document_root": settings.MEDIA_ROOT,
            },
        ),
    ]

Обратите внимание: этот фрагмент предполагает, что значение MEDIA_URL равно 'media/'. Он вызовет представление serve(), передав ему путь из URLconf и обязательный параметр document_root.

Поскольку задавать этот шаблон URL может быть несколько утомительно, Django поставляется с небольшой вспомогательной функцией для URL — static(). Она принимает в качестве параметров префикс, например MEDIA_URL, и путь к представлению, записанный через точки, например 'django.views.static.serve'. Все остальные параметры функции будут переданы представлению без изменений.

Представления для обработки ошибок

В Django по умолчанию предусмотрено несколько представлений для обработки ошибок HTTP. Информацию о том, как заменить их собственными представлениями, см. в разделе Настройка представлений для обработки ошибок.

Представление 404 (страница не найдена)

defaults.page_not_found(request, exception, template_name='404.html')

Когда внутри представления вызывается исключение Http404, Django загружает специальное представление для обработки ошибок 404. По умолчанию это представление django.views.defaults.page_not_found(), которое либо выводит сообщение «Не найдено», либо загружает и отображает шаблон 404.html, если вы создали его в корневом каталоге шаблонов.

Представление 404 по умолчанию передаёт шаблону две переменные: request_path — URL, вызвавший ошибку, и exception — удобное представление исключения, вызвавшего это представление (например, оно может содержать сообщение, переданное конкретному экземпляру Http404).

О представлениях 404 следует помнить три вещи:

  • Представление 404 вызывается и в том случае, если Django не находит совпадений после проверки всех регулярных выражений в URLconf.
  • Представлению 404 передаётся объект RequestContext, и оно будет иметь доступ к переменным, предоставленным процессорами контекста шаблонов (например, MEDIA_URL).
  • Если в модуле настроек параметру DEBUG присвоено значение True, представление 404 никогда не будет использоваться, а вместо него отобразится URLconf с отладочной информацией.

Представление 500 (ошибка сервера)

defaults.server_error(request, template_name='500.html')

Аналогичным образом Django обрабатывает ошибки времени выполнения в коде представлений особым образом. Если представление вызывает исключение, Django по умолчанию вызывает представление django.views.defaults.server_error, которое либо выводит сообщение «Ошибка сервера», либо загружает и отображает шаблон 500.html, если вы создали его в корневом каталоге шаблонов.

Представление 500 по умолчанию не передаёт переменных шаблону 500.html и отображает его с пустым Context, чтобы снизить вероятность дополнительных ошибок.

Если в модуле настроек параметру DEBUG присвоено значение True, представление 500 никогда не будет использоваться, а вместо него отобразится трассировка стека с отладочной информацией.

Представление 403 (доступ запрещён по HTTP)

defaults.permission_denied(request, exception, template_name='403.html')

Как и для представлений 404 и 500, в Django есть представление для обработки ошибок 403 Forbidden. Если представление вызывает исключение 403, Django по умолчанию вызывает представление django.views.defaults.permission_denied.

Это представление загружает и отображает шаблон 403.html из корневого каталога шаблонов или, если такого файла нет, выводит текст «403 Forbidden» в соответствии с разделом 15.5.4 RFC 9110 (спецификацией HTTP 1.1). Контекст шаблона содержит exception — строковое представление исключения, вызвавшего это представление.

django.views.defaults.permission_denied вызывается исключением PermissionDenied. Чтобы запретить доступ в представлении, можно использовать такой код:

from django.core.exceptions import PermissionDenied


def edit(request, pk):
    if not request.user.is_staff:
        raise PermissionDenied
    # ...

Представление 400 (неверный запрос)

defaults.bad_request(request, exception, template_name='400.html')

Когда в Django возникает исключение SuspiciousOperation, его может обработать компонент Django (например, сбросив данные сеанса). Если исключение не обработано специальным образом, Django сочтёт текущий запрос «неверным запросом», а не ошибкой сервера.

django.views.defaults.bad_request во многом аналогично представлению server_error, но возвращает код состояния 400, указывающий, что ошибка возникла в результате действий клиента. По умолчанию в контекст шаблона не передаются сведения об исключении, вызвавшем это представление, поскольку сообщение исключения может содержать конфиденциальную информацию, например пути файловой системы.

Представления bad_request также используются только в том случае, если DEBUG имеет значение False.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/views/

Spec-Zone.ru

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