内置视图¶
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.service'
。其他任何函数参数都将透明地传递给视图。
错误视图¶
Django 默认提供了一些处理 HTTP 错误的视图。要用你自己的自定义视图覆盖这些视图,请参见 自定义报错视图。
404(页面没有找到))视图¶
- defaults.page_not_found(request, exception, template_name='404.html')¶
当你在视图中提出 Http404
时,Django 会加载一个专门处理 404 错误的视图。默认情况下,它是视图 django.views.defaults.page_not_found()
,如果你在根模板目录下创建了模板 404.html
,那么它要么产生“Not Found”消息,要么加载并渲染它。
默认的 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
,则会产生一个“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 会将当前请求视为“bad request”而不是服务器错误。
django.views.defaults.bad_request
,在其他方面与 server_error
视图非常相似,但返回的状态码为 400,表示错误条件是由客户端操作造成的。默认情况下,与触发该视图的异常无关的任何内容都不会传递给模板上下文,因为异常消息可能包含文件系统路径等敏感信息。
bad_request
视图也只有在 DEBUG`
为 False
时才能使用。