内置视图¶
Django 的一些内置视图在编写视图以及文档的其他地方有详细说明。
在开发中提供文件¶
-
static.
serve
(request, path, document_root, show_indexes=False)¶
除了项目的静态资源之外,可能还有其他文件,为了方便起见,您希望 Django 在本地开发中为您提供这些文件。 serve()
视图可用于提供您提供的任何目录。(此视图未针对生产环境进行强化,应仅用作开发辅助工具;您应该在生产环境中使用真正的前端 Web 服务器来提供这些文件)。
最有可能的例子是MEDIA_ROOT
中的用户上传内容。 django.contrib.staticfiles
用于静态资源,没有内置处理用户上传文件的功能,但您可以通过将类似以下内容附加到 URLconf 来让 Django 提供您的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,
},
),
]
请注意,该代码段假定您的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#section-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
视图。