Django的几个内置视图记录在 编写视图函数 以及文档中的其他地方。
除了项目的静态资产之外,可能还有一些文件,为了方便起见,您希望让Django为您在本地开发中提供服务。这个 serve()
视图可用于为您提供的任何目录提供服务。(这个观点是 not 对生产使用进行了强化,应该仅用作开发辅助;您应该使用真正的前端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错误的视图。要使用自己的自定义视图覆盖这些视图,请参见 自定义错误视图 .
当你举起 Http404
从一个视图中,Django加载一个专门用于处理404错误的特殊视图。默认情况下,它是视图 django.views.defaults.page_not_found()
,它要么生成“Not Found”消息,要么加载并呈现模板 404.html
如果是在根模板目录中创建的。
默认404视图将向模板传递两个变量: request_path
,这是导致错误的URL,以及 exception
,这是触发视图的异常的有用表示(例如,包含传递给特定 Http404
实例)。
关于404视图需要注意三点:
如果Django在检查完urlconf中的每个正则表达式后都找不到匹配项,则也会调用404视图。
404视图通过 RequestContext
并且可以访问模板上下文处理器提供的变量(例如 MEDIA_URL
)
如果 DEBUG
设置为 True
(在设置模块中),则永远不会使用404视图,而是显示您的urlconf,其中包含一些调试信息。
类似地,Django在视图代码中出现运行时错误时执行特殊情况行为。如果视图导致异常,Django将在默认情况下调用该视图 django.views.defaults.server_error
,它要么生成“服务器错误”消息,要么加载并呈现模板 500.html
如果是在根模板目录中创建的。
默认的500视图不向 500.html
模板并用空的 Context
减少额外错误的可能性。
如果 DEBUG
设置为 True
(在您的设置模块中),那么您的500视图将永远不会被使用,并且将显示带有一些调试信息的回溯。
与404和500视图相同,Django有一个处理403个禁止错误的视图。如果视图导致403异常,则django将在默认情况下调用该视图 django.views.defaults.permission_denied
.
此视图加载并呈现模板 403.html
在您的根模板目录中,或者如果此文件不存在,则改为提供文本“403禁止”,如 RFC 9110#section-15.5.4 (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
# ...
当A SuspiciousOperation
在Django中引发,它可以由Django的组件处理(例如重置会话数据)。如果没有特别处理,Django会将当前请求视为“错误请求”,而不是服务器错误。
django.views.defaults.bad_request
,在其他方面与 server_error
视图,但返回状态代码400,指示错误条件是客户端操作的结果。默认情况下,与触发视图的异常相关的任何内容都不会传递到模板上下文,因为异常消息可能包含敏感信息,如文件系统路径。
bad_request
视图也仅在以下情况下使用 DEBUG
是 False
.
12月 18, 2023