Встроенные представления
Несколько встроенных представлений 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 Запрещено», как указано в 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(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/2.0/ref/views/