内置视图

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

为开发中的文件提供服务

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

除了你的项目的静态资源外,可能还有一些其他的文件,为了方便,你想让 Django 在本地开发中为你提供服务。serve() 视图可以用来为你给它的任何目录提供服务。(这个视图并 没有 强到用于生产,只应该作为开发辅助工具,你应该在生产中使用真正的前端 Web 服务器来服务这些文件)。

最有可能的例子是用户在 MEDIA_ROOT 中上传的内容。django.contrib.staticfiles 是为静态资源设计的,并没有内置处理用户上传文件的功能,但是你可以通过在 URLconf 中添加这样的内容,让 Django 为你的 MEDIA_ROOT 服务:

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,
            },
        ),
    ]

Note, the snippet assumes your MEDIA_URL has a value of 'media/'. This will call the serve() view, passing in the path from the URLconf and the (required) document_root parameter.

由于定义这种 URL 模式可能会变得有点麻烦,Django 提供了一个小的 URL 辅助函数 static(),它的参数是前缀,如 MEDIA_URL 和一个指向视图的点分隔路径,如 'django.views.static.service'。其他任何函数参数都将透明地传递给视图。

错误视图

Django 默认提供了一些处理 HTTP 错误的视图。要用你自己的自定义视图覆盖这些视图,请参见 自定义报错视图

404(页面没有找到))视图

defaults.page_not_found(request, exception, template_name='404.html')

当你在视图中提出 Http404 时,Django 会加载一个专门处理 404 错误的视图。默认情况下,它是视图 django.views.defaults.page_not_found(),如果你在根模板目录下创建了模板 404.html`,那么它要么产生“Not Found”消息,要么加载并渲染它。

默认的 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,则会产生一个“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

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 9110#section-15.5.4 (the HTTP 1.1 Specification). The template context contains exception, which is the string representation of the exception that triggered the view.

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 会将当前请求视为“bad request”而不是服务器错误。

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

bad_request 视图也只有在 DEBUG`False 时才能使用。