{"title":"内置视图","version":"3.1","locale":"zh-hans","docname":"ref/views","url":"/zh-hans/3.1/ref/views/","canonical":"https://djangodocs.dev/zh-hans/3.1/ref/views/","summary":"Django 内置的几个视图在 编写视图 以及文档的其他地方都有记载。 为开发中的文件提供服务 Link to this heading # static. serve ( request , path , document_root , show_indexes = False ) Link to this…","html":"<span id=\"built-in-views\"></span><h1>内置视图<a class=\"heading-anchor\" href=\"#module-django.views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django 内置的几个视图在 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/http/views/\"><span class=\"doc\">编写视图</span></a> 以及文档的其他地方都有记载。</p>\n<section id=\"serving-files-in-development\">\n<h2>为开发中的文件提供服务<a class=\"heading-anchor\" href=\"#serving-files-in-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.static.serve\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">static.</span></span><span class=\"sig-name descname\"><span class=\"pre\">serve</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">path</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">document_root</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">show_indexes</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.static.serve\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>除了你的项目的静态资源外，可能还有一些其他的文件，为了方便，你想让 Django 在本地开发中为你提供服务。<a class=\"reference internal\" href=\"#django.views.static.serve\" title=\"django.views.static.serve\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">serve()</span></code></a> 视图可以用来为你给它的任何目录提供服务。（这个视图并 <strong>没有</strong> 强到用于生产，只应该作为开发辅助工具，你应该在生产中使用真正的前端 Web 服务器来服务这些文件）。</p>\n<p>最有可能的例子是用户在 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> 中上传的内容。<code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.staticfiles</span></code> 是为静态资源设计的，并没有内置处理用户上传文件的功能，但是你可以通过在 URLconf 中添加这样的内容，让 Django 为你的 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> 服务：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">re_path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.static</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">serve</span>\n\n<span class=\"c1\"># ... the rest of your URLconf goes here ...</span>\n\n<span class=\"k\">if</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span><span class=\"p\">:</span>\n    <span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"p\">[</span>\n        <span class=\"n\">re_path</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^media/(?P&lt;path&gt;.*)$&#39;</span><span class=\"p\">,</span> <span class=\"n\">serve</span><span class=\"p\">,</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;document_root&#39;</span><span class=\"p\">:</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">MEDIA_ROOT</span><span class=\"p\">,</span>\n        <span class=\"p\">}),</span>\n    <span class=\"p\">]</span>\n</code></pre></div>\n<p>注意，这段代码假设你的 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a> 的值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'/media/'</span></code>。这将调用 <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">service()</span></code> 视图，传递 URLconf 的路径和（必要的）``document_root`` 参数。</p>\n<p>由于定义这种 URL 模式可能会变得有点麻烦，Django 提供了一个小的 URL 辅助函数 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/urls/#django.conf.urls.static.static\" title=\"django.conf.urls.static.static\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">static()</span></code></a>，它的参数是前缀，如 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a> 和一个指向视图的点分隔路径，如 <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.views.static.service'</span></code>。其他任何函数参数都将透明地传递给视图。</p>\n</section>\n<section id=\"error-views\">\n<span id=\"id1\"></span><h2>错误视图<a class=\"heading-anchor\" href=\"#error-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django 默认提供了一些处理 HTTP 错误的视图。要用你自己的自定义视图覆盖这些视图，请参见 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/http/views/#customizing-error-views\"><span class=\"std std-ref\">自定义报错视图</span></a>。</p>\n<section id=\"the-404-page-not-found-view\">\n<span id=\"http-not-found-view\"></span><h3>404（页面没有找到)）视图<a class=\"heading-anchor\" href=\"#the-404-page-not-found-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.page_not_found\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">page_not_found</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'404.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.page_not_found\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当你在视图中提出 <a class=\"reference internal\" href=\"/zh-hans/3.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> 时，Django 会加载一个专门处理 404 错误的视图。默认情况下，它是视图 <a class=\"reference internal\" href=\"#django.views.defaults.page_not_found\" title=\"django.views.defaults.page_not_found\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.defaults.page_not_found()</span></code></a>，如果你在根模板目录下创建了模板 404.html`，那么它要么产生“Not Found”消息，要么加载并渲染它。</p>\n<p>默认的 404 视图将向模板传递两个变量：<code class=\"docutils literal notranslate\"><span class=\"pre\">request_path</span></code>，这是导致错误的 URL，和 <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code>，这是触发视图的异常的有用表示（例如，包含传递给特定 <code class=\"docutils literal notranslate\"><span class=\"pre\">Http404</span></code> 实例的任何消息）。</p>\n<p>关于 404 视图需要注意的三个要点：</p>\n<ul class=\"simple\">\n<li><p>如果 Django 在检查了 URLconf 中的每一个正则表达式后都没有找到匹配的结果，也会调用 404 视图。</p></li>\n<li><p>404 视图被传递了一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/templates/api/#django.template.RequestContext\" title=\"django.template.RequestContext\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code></a>，并且将可以访问由你的模板上下文处理器提供的变量（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code>）。</p></li>\n<li><p>如果 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> （在你的配置模块中），那么你的 404 视图将永远不会被使用，而你的 URLconf 将被显示，并附带一些调试信息。</p></li>\n</ul>\n</section>\n<section id=\"the-500-server-error-view\">\n<span id=\"http-internal-server-error-view\"></span><h3>500（服务器错误）视图<a class=\"heading-anchor\" href=\"#the-500-server-error-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.server_error\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">server_error</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'500.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.server_error\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>同样，在视图代码出现运行时错误的情况下，Django 也会执行特定行为。如果一个视图出现异常，Django 默认会调用视图 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.server_error</span></code>，如果你在根模板目录下创建了模板 <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code>，则会产生一个“Server Error”消息或加载并渲染模板 <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code>。</p>\n<p>默认的 500 视图不向 <code class=\"docutils literal notranslate\"><span class=\"pre\">500.html</span></code> 模板传递任何变量，并以一个空的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Context</span></code> 呈现，以减少额外错误的机会。</p>\n<p>如果 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> 被设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> （在你的配置模块中），那么你的 500 视图将永远不会被使用，而会显示一些调试信息的回溯。</p>\n</section>\n<section id=\"the-403-http-forbidden-view\">\n<span id=\"http-forbidden-view\"></span><h3>403（HTTP 禁止）视图<a class=\"heading-anchor\" href=\"#the-403-http-forbidden-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.permission_denied\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">permission_denied</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'403.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.permission_denied\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>与 404 和 500 视图一样，Django 也有一个视图来处理 403 禁止错误。如果一个视图出现 403 异常，那么 Django 默认会调用视图 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.permission_denied</span></code>。</p>\n<p>这个视图从你的根模板目录加载和渲染 <code class=\"docutils literal notranslate\"><span class=\"pre\">403.html</span></code> 模板，如果这个文件不存在将会显示“403 Forbidden”，按照 <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7231.html#section-6.5.3\"><strong>RFC 7231 Section 6.5.3</strong></a> （HTTP 1.1 规范）。 模板上下文包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code>，它是触发视图的异常的字符串表示形式。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.permission_denied</span></code> 由一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/exceptions/#django.core.exceptions.PermissionDenied\" title=\"django.core.exceptions.PermissionDenied\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">PermissionDenied</span></code></a> 异常触发。要拒绝一个视图的访问，你可以使用这样的代码：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">PermissionDenied</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">edit</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"ow\">not</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_staff</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">PermissionDenied</span>\n    <span class=\"c1\"># ...</span>\n</code></pre></div>\n</section>\n<section id=\"the-400-bad-request-view\">\n<span id=\"http-bad-request-view\"></span><h3>400（错误请求）视图<a class=\"heading-anchor\" href=\"#the-400-bad-request-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.defaults.bad_request\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">defaults.</span></span><span class=\"sig-name descname\"><span class=\"pre\">bad_request</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">template_name</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'400.html'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.defaults.bad_request\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>当 Django 中发生了一个 <a class=\"reference internal\" href=\"/zh-hans/3.1/ref/exceptions/#django.core.exceptions.SuspiciousOperation\" title=\"django.core.exceptions.SuspiciousOperation\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">SuspiciousOperation</span></code></a> 时，可能会被 Django 的某个组件处理（比如重置会话数据）。如果没有特别处理，Django 会将当前请求视为“bad request”而不是服务器错误。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.defaults.bad_request</span></code>，在其他方面与 <code class=\"docutils literal notranslate\"><span class=\"pre\">server_error</span></code> 视图非常相似，但返回的状态码为 400，表示错误条件是由客户端操作造成的。默认情况下，与触发该视图的异常无关的任何内容都不会传递给模板上下文，因为异常消息可能包含文件系统路径等敏感信息。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">bad_request</span></code> 视图也只有在 <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG`</span></code> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> 时才能使用。</p>\n</section>\n</section>","rootId":"module-django.views","toc":[{"title":"为开发中的文件提供服务","anchor":"serving-files-in-development","children":[]},{"title":"错误视图","anchor":"error-views","children":[{"title":"404（页面没有找到)）视图","anchor":"the-404-page-not-found-view","children":[]},{"title":"500（服务器错误）视图","anchor":"the-500-server-error-view","children":[]},{"title":"403（HTTP 禁止）视图","anchor":"the-403-http-forbidden-view","children":[]},{"title":"400（错误请求）视图","anchor":"the-400-bad-request-view","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/3.1/ref/"}],"prev":{"docname":"ref/validators","title":"验证器","url":"/zh-hans/3.1/ref/validators/"},"next":{"docname":"misc/index","title":"元文件和杂记","url":"/zh-hans/3.1/misc/"},"formats":{"html":"/zh-hans/3.1/ref/views/","markdown":"/zh-hans/3.1/ref/views.md","json":"/zh-hans/3.1/ref/views.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/ref/views.txt","official":"https://docs.djangoproject.com/zh-hans/3.1/ref/views/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}