Skip to main content

内置视图

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

在开发中提供文件

static.serve(request, path, document_root, show_indexes=False)

除了项目的静态资源之外,可能还有其他文件,为了方便起见,您希望Django在本地开发中为您服务。 serve() 视图可用于服务您提供的任何目录。 (此视图是为生产使用而固化的 ,应仅用作开发辅助工具;应使用真正的前端Web服务器在生产中提供这些文件)。

最可能的示例是用户在 MEDIA_ROOT 中上传的内容。 django.contrib.staticfiles 用于静态资源,并且没有内置处理用户上传的文件,但是您可以让Django通过在URLconf中附加类似的东西来为您的 MEDIA_ROOT 提供服务:

from django.conf import settings
from django.views.static import serve

# ... the rest of your URLconf goes here ...

if settings.DEBUG:
    urlpatterns += [
        url(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,并显示一些调试信息。

Changed in Django 1.9:

page_not_found() 的签名改变了。该函数现在接受第二个参数,触发错误的异常。异常的有用表示也在模板上下文中传递。

Changed in Django 1.10:

通过不存在的 template_name 将提高 TemplateDoesNotExist

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视图,并且将显示回溯,并显示一些调试信息。

Changed in Django 1.10:

通过不存在的 template_name 将提高 TemplateDoesNotExist

403(HTTP禁止)视图

defaults.permission_denied(request, exception, template_name='403.html')

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

此视图在您的根模板目录中加载并呈现模板 403.html,或者如果此文件不存在,则根据 RFC 7231#section-6.5.3 (HTTP 1.1规范)提供文本“403 Forbidden”。模板上下文包含 exception,它是触发视图的异常的unicode表示。

django.views.defaults.permission_deniedPermissionDenied 异常触发。要在视图中拒绝访问,您可以使用这样的代码:

from django.core.exceptions import PermissionDenied

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

permission_denied() 的签名在Django 1.9中改变。该函数现在接受第二个参数,触发错误的异常。异常的unicode表示也在模板上下文中传递。

Changed in Django 1.10:

通过不存在的 template_name 将提高 TemplateDoesNotExist

400(错误请求)视图

defaults.bad_request(request, exception, template_name='400.html')

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

django.views.defaults.bad_request 在其他方面与 server_error 视图非常相似,但返回状态代码400,表示错误条件是客户端操作的结果。默认情况下,与触发视图的异常相关的任何内容都传递给模板上下文,因为异常消息可能包含敏感信息,如文件系统路径。

bad_request 视图也仅在 DEBUGFalse 时使用。

Changed in Django 1.9:

bad_request() 的签名在Django 1.9中改变。该函数现在接受第二个参数,触发错误的异常。

Changed in Django 1.10:

通过不存在的 template_name 将提高 TemplateDoesNotExist