Spec-Zone.ru › Django 1.11

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

Несколько встроенных представлений 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.views.static import serve

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

if settings.DEBUG:
    urlpatterns += [
        url(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(), которое либо выводит очень простое сообщение «Not Found», либо загружает и отображает шаблон 404.html, если вы его создали в корневом каталоге шаблонов.

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

Три момента, которые следует учитывать относительно представлений 404:

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

Передача несуществующего template_name вызовет TemplateDoesNotExist.

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

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

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

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

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

Изменено в Django 1.10:

Передача несуществующего template_name вызовет TemplateDoesNotExist.

Представление 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», как указано в RFC 7231#section-6.5.3 (Спецификация 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
    # ...
Изменено в Django 1.10:

Передача несуществующего template_name вызовет TemplateDoesNotExist.

Представление 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 1.10:

Передача несуществующего template_name вызовет TemplateDoesNotExist.

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

Spec-Zone.ru

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