内置视图 — Django 文档

来自菜鸟教程
Django/docs/3.2.x/ref/views
跳转至:导航、​搜索

内置视图

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

正在开发中的服务文件

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

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

最可能的例子是 :setting:`MEDIA_ROOT` 中用户上传的内容。 django.contrib.staticfiles 用于静态资产并且没有对用户上传文件的内置处理,但是您可以通过将类似这样的内容附加到您的 :setting:`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,
        }),
    ]

请注意,该代码段假定您的 :setting:`MEDIA_URL` 的值为 '/media/'。 这将调用 serve() 视图,传入来自 URLconf 的路径和(必需的)document_root 参数。

由于定义这种 URL 模式可能会变得有点麻烦,Django 附带了一个小的 URL 辅助函数 static(),它将前缀作为参数,例如 :setting:`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)。
  • 如果 :setting:`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 进行渲染以减少出现其他错误的机会。

如果 :setting:`DEBUG` 设置为 True(在你的设置模块中),那么你的 500 视图将永远不会被使用,而是会显示回溯,以及一些调试信息.


403 (HTTP Forbidden) 视图

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

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

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

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

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')

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

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

bad_request 视图也仅在 :setting:`DEBUG`False 时使用。