内置视图

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

在开发中提供文件服务

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

除了项目的静态资产之外,可能还有一些文件,为了方便起见,您希望让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错误的视图。要使用自己的自定义视图覆盖这些视图,请参见 自定义错误视图 .

404(找不到页面)视图

defaults.page_not_found(request, exception, template_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(服务器错误)视图

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禁止)视图

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

与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
    # ...

400(错误请求)视图

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

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

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

bad_request 视图也仅在以下情况下使用 DEBUGFalse .