Встроенные виды

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

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

static.serve( Запрос , путь , 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( запрос , исключение , 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( запрос , 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( запрос , исключение , template_name = '403.html' )

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

В этом представлении загружается и отображается шаблон 403.htmlв корневом каталоге шаблонов, или, если этот файл не существует, вместо этого отображается текст «403 Запрещено», согласно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
    # ...

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

defaults.bad_request( запрос , исключение , template_name = '400.html' )

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

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

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

Copyright ©2021 All rights reserved