内置视图¶
Django 的一些内置视图在 编写视图 以及文档的其他地方有说明。
在开发环境中提供文件¶
- static.serve(request, path, document_root, show_indexes=False)¶
除了项目静态资源外,可能还有一些其他文件,为了方便起见,您希望 Django 在本地开发环境中为您提供服务。 serve()
视图可用于提供您提供的任何目录。(此视图**不**适用于生产环境,并且应仅用作开发辅助工具;您应该使用真正的前端 Web 服务器在生产环境中提供这些文件)。
最可能的示例是 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 视图需要注意的三件事
如果 Django 在检查 URLconf 中的每个正则表达式后未找到匹配项,也会调用 404 视图。
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 禁止错误。如果视图导致 403 异常,则 Django 默认会调用视图 django.views.defaults.permission_denied
。
此视图加载并渲染根模板目录中的 403.html
模板,或者如果此文件不存在,则根据 RFC 9110 第 15.5.4 节(HTTP 1.1 规范)提供文本“403 Forbidden”。模板上下文包含 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,表示错误条件是客户端操作的结果。默认情况下,不会将与触发该视图的异常相关的任何内容传递到模板上下文,因为异常消息可能包含敏感信息,例如文件系统路径。
只有当 DEBUG
为 False
时,才会使用 bad_request
视图。