内置视图

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

请注意,该代码段假定您的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#section-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视图。

返回顶部