内置视图

Django 的一些内置视图在 编写视图 以及文档的其他地方有说明。

在开发环境中提供文件

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

除了项目静态资源外,可能还有一些其他文件,为了方便起见,您希望 Django 在本地开发环境中为您提供服务。 serve() 视图可用于提供您提供的任何目录。(此视图**不**适用于生产环境,并且应仅用作开发辅助工具;您应该使用真正的前端 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(),它要么生成“未找到”消息,要么加载并渲染模板 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 模板,或者如果此文件不存在,则根据 RFC 9110 第 15.5.4 节(HTTP 1.1 规范)提供文本“403 Forbidden”。模板上下文包含 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')

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

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

只有当 DEBUGFalse 时,才会使用 bad_request 视图。

返回顶部