内置视图 — Django 文档
内置视图
Writing views 以及文档的其他地方记录了 Django 的几个内置视图。
为开发中的文件提供服务
- static.serve(request, path, document_root, show_indexes=False)
除了项目的静态资产之外,可能还有一些文件,为方便起见,您希望 Django 在本地开发中为您服务。 serve() 视图可用于为您提供的任何目录提供服务。 (此视图 不是 强化用于生产用途,应仅用作开发辅助;您应该使用真正的前端 Web 服务器在生产中提供这些文件)。
最可能的例子是 :setting:`MEDIA_ROOT` 中用户上传的内容。 django.contrib.staticfiles
用于静态资产并且没有对用户上传文件的内置处理,但是您可以通过将类似这样的内容附加到您的 :setting:`MEDIA_ROOT`网址配置:
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,
}),
]
请注意,该代码段假定您的 :setting:`MEDIA_URL` 的值为 '/media/'
。 这将调用 serve() 视图,传入来自 URLconf 的路径和(必需的)document_root
参数。
由于定义这种 URL 模式可能会变得有点麻烦,Django 附带了一个小的 URL 辅助函数 static(),它将前缀作为参数,例如 :setting:`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 视图将向模板传递两个变量:request_path
,这是导致错误的 URL,以及 exception
,这是触发视图的异常的有用表示(例如 包含传递给特定 Http404
实例的任何消息)。
关于 404 视图需要注意的三个要点:
- 如果 Django 在检查 URLconf 中的每个正则表达式后没有找到匹配项,也会调用 404 视图。
- 404 视图被传递一个 RequestContext 并且可以访问模板上下文处理器提供的变量(例如
MEDIA_URL
)。 - 如果 :setting:`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
进行渲染以减少出现其他错误的机会。
如果 :setting:`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 7231# 提供文本“403 Forbidden”第 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')
当 SuspiciousOperation 在 Django 中引发时,它可能由 Django 的组件处理(例如重置会话数据)。 如果没有特别处理,Django 会将当前请求视为“错误请求”而不是服务器错误。
django.views.defaults.bad_request
在其他方面与 server_error
视图非常相似,但返回状态码 400,指示错误条件是客户端操作的结果。 默认情况下,与触发视图的异常相关的任何内容都不会传递给模板上下文,因为异常消息可能包含文件系统路径等敏感信息。
bad_request
视图也仅在 :setting:`DEBUG` 为 False
时使用。