内置视图

几个Django的内置视图记录在Writing views以及文档中的其他地方。

正在开发中的文件

静态的。serve(request, path, document_root, show_indexes=False)

除了项目的静态资产之外,可能还有一些文件,为了方便起见,您希望让Django在本地开发中为您服务。 可以使用serve()视图来为您提供的任何目录提供服务。 (This view is not hardened for production use and should be used only as a development aid; you should serve these files in production using a real front-end web server).

最可能的例子是在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和(required)document_root参数传递路径。

由于定义这个URL模式会变得有点麻烦,Django提供了一个小的URL助手函数static(),它以MEDIA_URL和前缀视图的路径,如'django.views.static.serve' 任何其他的函数参数将被透明地传递给视图。

错误视图

Django默认有几个视图用于处理HTTP错误。 要用您自己的自定义视图覆盖这些视图,请参阅Customizing error views

404(页面未找到)视图

默认值。page_not_foundrequestexceptiontemplate_name ='404.html'

当你从视图中提取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将被显示,并带有一些调试信息。

500(服务器错误)视图

默认值。server_errorrequesttemplate_name ='500.html'

同样,Django在视图代码中执行错误的情况下执行特殊行为。 If a view results in an exception, Django will, by default, call the view django.views.defaults.server_error, which either produces a very simple “Server Error” message or loads and renders the template 500.html if you created it in your root template directory.

默认的500视图不会将变量传递给500.html模板,并使用空的Context进行渲染,以减少附加错误的几率。

如果DEBUG设置为True(在您的设置模块中),那么您的500视图将永远不会被使用,并且将会显示回溯,并带有一些调试信息。

403(HTTP Forbidden)视图

默认值。permission_deniedrequestexceptiontemplate_name ='403.html'

与404和500视图一样,Django有处理403个Forbidden错误的视图。 如果一个视图导致一个403异常,那么Django默认会调用视图django.views.defaults.permission_denied

This view loads and renders the template 403.html in your root template directory, or if this file does not exist, instead serves the text “403 Forbidden”, as per RFC 7231#section-6.5.3 (the HTTP 1.1 Specification). 模板上下文包含exception,这是触发视图的异常的字符串表示形式。

django.views.defaults.permission_denied is triggered by a PermissionDenied exception. 要在视图中拒绝访问,您可以使用如下代码:

from django.core.exceptions import PermissionDenied

def edit(request, pk):
    if not request.user.is_staff:
        raise PermissionDenied
    # ...

400(坏请求)视图

默认值。bad_request(request, exception, template_name='400.html')

当在Django中引发SuspiciousOperation时,它可能由Django的一个组件处理(例如重置会话数据)。 如果没有特别处理,Django会认为当前请求是“错误的请求”,而不是服务器错误。

django.views.defaults.bad_request, is otherwise very similar to the server_error view, but returns with the status code 400 indicating that the error condition was the result of a client operation. 默认情况下,与触发视图的异常相关的任何内容都将传递到模板上下文,因为异常消息可能包含文件系统路径等敏感信息。

bad_request视图也仅在DEBUGFalse时使用。