Django的几个内置视图记录在 写入视图 以及文档中的 其他位置。
1. 在开发中提供文件
static.serve(request, path, document_root, show_indexes=False)
除了项目的静态资源之外,可能还有其他文件,为方便起见,您希望Django在本地开发中为您服务。serve()视图可用于为您给的任何目录提供服务。(此视图不会用于生产用途,应仅用作开发辅助;您应使在生产中为真正的Web服务器提供这些文件)。
最可能的例子是用户上传的内容目录[ MEDIA_ROOT ] z(https://docs.djangoproject.com/en/2.1/ref/settings/#std:setting-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作为prefix参数,任何其他函数参数将透明地传递给视图。
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 错误视图
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
,这是导致错误的URLexception
,它是触发视图的异常的有用表示(例如,包含传递给特定Http404实例的任何消息)。
有关404视图的三点注意事项:
- 如果在检查URLconf中的每个正则表达式后Django没有找到匹配项,也会调用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 Forbidden)视图
defaults.permission_denied(request, exception, template_name='403.html')
与404和500视图一样,Django可以处理403 Forbidden错误。如果视图导致403异常,那么Django默认会调用django.views.defaults.permission_denied
视图。
此视图在根模板目录中加载和呈现403.html
模板,或者如果此文件不存在,则提供文本“403 Forbidden”,按照RFC 7231#section-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')
当在Django中引发一个SuspiciousOperation异常时,它可以由Django的一个组件处理(例如重置会话数据)。如果没有特别处理,Django会将当前请求视为“错误请求”而不是服务器错误。
否则与server_error视图非常相似 ,但返回状态代码400,表示错误条件是客户端操作的结果。默认情况下,与触发视图的异常无关的任何内容都会传递给模板上下文,因为异常消息可能包含敏感信息,如文件系统路径。
bad_request视图时也只用用在DEBUG=False
的时候。