{"title":"中间件","version":"5.2","locale":"zh-hans","docname":"ref/middleware","url":"/zh-hans/5.2/ref/middleware/","canonical":"https://djangodocs.dev/zh-hans/5.2/ref/middleware/","summary":"这篇文档解释了所有 Django 自带的中间件组件。关于如何使用它们以及如何编写自己的中间件，请参见 中间件使用指南 。 可用的中间件 Link to this heading # 缓存中间件 Link to this heading # class UpdateCacheMiddleware Link to this…","html":"<span id=\"middleware\"></span><h1>中间件<a class=\"heading-anchor\" href=\"#module-django.middleware\"><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/5.2/topics/http/middleware/\"><span class=\"doc\">中间件使用指南</span></a>。</p>\n<section id=\"available-middleware\">\n<h2>可用的中间件<a class=\"heading-anchor\" href=\"#available-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"module-django.middleware.cache\">\n<span id=\"cache-middleware\"></span><h3>缓存中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.cache.UpdateCacheMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UpdateCacheMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.cache.UpdateCacheMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.cache.FetchFromCacheMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FetchFromCacheMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.cache.FetchFromCacheMiddleware\"><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/5.2/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a> 配置定义的时间内被缓存。参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/cache/\"><span class=\"doc\">缓存文档</span></a>。</p>\n</section>\n<section id=\"module-django.middleware.common\">\n<span id=\"common-middleware\"></span><h3>“通用”中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.common\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.common.CommonMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CommonMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.common.CommonMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.common.CommonMiddleware.response_redirect_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">response_redirect_class</span></span><a class=\"heading-anchor\" href=\"#django.middleware.common.CommonMiddleware.response_redirect_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/request-response/#django.http.HttpResponsePermanentRedirect\" title=\"django.http.HttpResponsePermanentRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponsePermanentRedirect</span></code></a>。子类化 <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code>，并重写该属性来定制中间件发出的重定向。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>为完美主义者增加了一些便利：</p>\n<ul>\n<li><p>禁止 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-DISALLOWED_USER_AGENTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DISALLOWED_USER_AGENTS</span></code></a> 配置中的用户代理访问，它应该是一个编译的正则表达式对象列表。</p></li>\n<li><p>根据 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-PREPEND_WWW\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PREPEND_WWW</span></code></a> 的配置进行 URL 重写。</p>\n<p>如果 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，并且初始的 URL 没有以斜线结尾，而且在 URLconf 中也没有找到，那么就会在最后附加一个斜线形成一个新的 URL。如果在 URLconf 中找到了这个新的 URL，那么 Django 会将请求重定向到这个新的 URL。否则，初始的 URL 就会被照常处理。</p>\n<p>例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar</span></code> 将被重定向到 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar/</span></code>，如果你没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar</span></code> 的有效 URL 模式，但 <em>有</em> <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar/</span></code> 的有效模式。</p>\n<p>如果 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-PREPEND_WWW\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PREPEND_WWW</span></code></a> 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，缺乏前导“www. ”的 URL 将被重定向到带有前导“www. ”的同一 URL。</p>\n<p>这两个选项都是为了规范 URL。其理念是，每个 URL 应该存在于一个地方，而且只有一个地方。从技术上讲，URL <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar</span></code> 与 <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.com/bar/</span></code> 是不同的——搜索引擎索引器会将它们视为单独的 URL——所以最好的做法是将 URL 规范化。</p>\n<p>如果有必要，可以使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/http/decorators/#django.views.decorators.common.no_append_slash\" title=\"django.views.decorators.common.no_append_slash\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">no_append_slash()</span></code></a> 装饰器将个别视图从 <code class=\"docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code> 行为中排除：</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.views.decorators.common</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">no_append_slash</span>\n\n\n<span class=\"nd\">@no_append_slash</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">sensitive_fbv</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;View to be excluded from APPEND_SLASH.&quot;&quot;&quot;</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">()</span>\n</code></pre></div>\n</li>\n<li><p>设置非流响应的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Length</span></code> 头。</p></li>\n</ul>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.common.BrokenLinkEmailsMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">BrokenLinkEmailsMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.common.BrokenLinkEmailsMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<ul class=\"simple\">\n<li><p>向 <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">manager</span></code> 发送失效链接通知邮件（参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/howto/error-reporting/\"><span class=\"doc\">如何管理错误报告</span></a>）。</p></li>\n</ul>\n</section>\n<section id=\"module-django.middleware.gzip\">\n<span id=\"gzip-middleware\"></span><h3>GZip 中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.gzip\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.gzip.GZipMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">GZipMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.gzip.GZipMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.gzip.GZipMiddleware.max_random_bytes\">\n<span class=\"sig-name descname\"><span class=\"pre\">max_random_bytes</span></span><a class=\"heading-anchor\" href=\"#django.middleware.gzip.GZipMiddleware.max_random_bytes\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 100。如果需要更改包含在压缩响应中的最大随机字节数，请子类化 <code class=\"docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code> 并重写该属性。</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>安全研究人员揭示了当在网站上使用压缩技术（包括 <code class=\"docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code>）时，该网站可能会暴露于多种可能的攻击。</p>\n<p>为了减轻攻击风险，Django 实施了一种称为 <em>Heal The Breach (HTB)</em> 的技术。它在每个响应中添加了最多 100 字节（参见 <a class=\"reference internal\" href=\"#django.middleware.gzip.GZipMiddleware.max_random_bytes\" title=\"django.middleware.gzip.GZipMiddleware.max_random_bytes\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">max_random_bytes</span></code></a>）的随机字节，以减弱攻击的效果。</p>\n<p>有关更多详细信息，请参阅 <a class=\"reference external\" href=\"https://ieeexplore.ieee.org/document/9754554\">BREACH 论文 (PDF)</a>、<a class=\"reference external\" href=\"https://www.breachattack.com/\">breachattack.com</a> 和 <a class=\"reference external\" href=\"https://www.breachattack.com/resources/BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf\">Heal The Breach (HTB) 论文</a>。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.middleware.gzip.GZipMiddleware</span></code> 为能理解 GZip 压缩的浏览器（所有现代浏览器）压缩内容。</p>\n<p>这个中间件应该放在任何其他需要读取或写入响应体的中间件之前，这样压缩就会在之后发生。</p>\n<p>如果以下任何一项为真，它将不会压缩内容：</p>\n<ul class=\"simple\">\n<li><p>内容主体长度小于 200 字节。</p></li>\n<li><p>响应已经设置了 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Encoding</span></code> 头。</p></li>\n<li><p>请求（浏览器）没有发送包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">gzip</span></code> 的 <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Encoding</span></code> 头。</p></li>\n</ul>\n<p>如果响应具有 <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> 标头，则会将 ETag 标记为弱标记，以符合 <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-8.8.1\"><strong>RFC 9110 Section 8.8.1</strong></a>。</p>\n<p>你可以使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/http/decorators/#django.views.decorators.gzip.gzip_page\" title=\"django.views.decorators.gzip.gzip_page\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gzip_page()</span></code></a> 装饰器对单个视图应用 GZip 压缩。</p>\n</section>\n<section id=\"module-django.middleware.http\">\n<span id=\"conditional-get-middleware\"></span><h3>条件 GET 中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.http\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.http.ConditionalGetMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">ConditionalGetMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.http.ConditionalGetMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>处理有条件的 GET 操作。如果响应没有 <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> 头，中间件会根据需要添加一个。如果响应有 <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> 头，而请求有 <code class=\"docutils literal notranslate\"><span class=\"pre\">If-None-Match</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">If-Modified-Since</span></code>，则响应被一个 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/request-response/#django.http.HttpResponseNotModified\" title=\"django.http.HttpResponseNotModified\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseNotModified</span></code></a> 替换。</p>\n<p>You can handle conditional GET operations with individual views using the\n<a class=\"reference internal\" href=\"/zh-hans/5.2/topics/http/decorators/#django.views.decorators.http.conditional_page\" title=\"django.views.decorators.http.conditional_page\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">conditional_page()</span></code></a> decorator.</p>\n</section>\n<section id=\"module-django.middleware.locale\">\n<span id=\"locale-middleware\"></span><h3>本地化中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.locale\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.locale.LocaleMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LocaleMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.locale.LocaleMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.locale.LocaleMiddleware.response_redirect_class\">\n<span class=\"sig-name descname\"><span class=\"pre\">response_redirect_class</span></span><a class=\"heading-anchor\" href=\"#django.middleware.locale.LocaleMiddleware.response_redirect_class\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/request-response/#django.http.HttpResponseRedirect\" title=\"django.http.HttpResponseRedirect\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseRedirect</span></code></a>。子类化 <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> 并重写该属性，以自定义中间件发出的重定向。</p>\n</dd></dl>\n\n</dd></dl>\n\n<p>可以根据请求的数据选择语言。它为每个用户定制内容。请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/i18n/translation/\"><span class=\"doc\">国际化文档</span></a>。</p>\n</section>\n<section id=\"module-django.contrib.messages.middleware\">\n<span id=\"message-middleware\"></span><h3>消息中间件<a class=\"heading-anchor\" href=\"#module-django.contrib.messages.middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.messages.middleware.MessageMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">MessageMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.messages.middleware.MessageMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>启用基于 cookie 和会话的消息支持。参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/messages/\"><span class=\"doc\">消息文档</span></a>。</p>\n</section>\n<section id=\"module-django.middleware.security\">\n<span id=\"id1\"></span><span id=\"security-middleware\"></span><h3>安全中间件<a class=\"heading-anchor\" href=\"#module-django.middleware.security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>如果您的部署情况允许，通常是一个好主意让您的前端 Web 服务器执行由 <code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 提供的功能。这样，如果有不由 Django 处理的请求（如静态媒体或用户上传的文件），它们将具有与请求到您的 Django 应用程序相同的保护。</p>\n</aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.security.SecurityMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SecurityMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.security.SecurityMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.middleware.security.SecurityMiddleware</span></code> 为请求／响应周期提供了若干安全增强功能。每一项都可以通过设置独立地启用或禁用。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_CONTENT_TYPE_NOSNIFF\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CONTENT_TYPE_NOSNIFF</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_CROSS_ORIGIN_OPENER_POLICY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CROSS_ORIGIN_OPENER_POLICY</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_INCLUDE_SUBDOMAINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_INCLUDE_SUBDOMAINS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_PRELOAD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_PRELOAD</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_SECONDS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_REDIRECT_EXEMPT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_REDIRECT_EXEMPT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_REFERRER_POLICY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_REFERRER_POLICY</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_SSL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_SSL_HOST</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_SSL_REDIRECT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_SSL_REDIRECT</span></code></a></p></li>\n</ul>\n<section id=\"http-strict-transport-security\">\n<span id=\"id2\"></span><h4>HTTP 严格传输安全<a class=\"heading-anchor\" href=\"#http-strict-transport-security\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>对于只能通过 HTTPS 访问的网站，你可以通过设置 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security\">&quot;Strict-Transport-Security&quot; 头</a> 来指示现代浏览器拒绝通过不安全的连接连接到你的域名（在给定的时间内）。这可以减少你受到一些 SSL 剥离中间人（MITM）的攻击。</p>\n<p>如果你将 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_SECONDS</span></code></a> 设置为一个非零的整数值，<code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 将为你在所有 HTTPS 响应中设置这个头。</p>\n<p>启用 HSTS 时，建议首先使用一个小的测试值，例如，将 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_SECONDS</span> <span class=\"pre\">=</span> <span class=\"pre\">3600</span></code></a> 设置为一小时。每次 Web 浏览器看到来自您网站的 HSTS 标头时，它将拒绝在给定的时间段内与您的域名进行非安全通信（使用 HTTP）。一旦您确认您的网站上的所有资源都以安全方式提供（即 HSTS 没有引发任何问题），则建议增加此值，以便不经常访问的访问者也受到保护（常见的值是 31536000 秒，即 1 年）。</p>\n<p>此外，如果你将 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_INCLUDE_SUBDOMAINS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_INCLUDE_SUBDOMAINS</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 将在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Strict-Transport-Security</span></code> 头中添加 <code class=\"docutils literal notranslate\"><span class=\"pre\">includeSubDomains</span></code> 指令。建议这样做（假设所有的子域都只使用 HTTPS 服务），否则你的网站仍然可能通过不安全的连接到子域而受到攻击。</p>\n<p>如果你希望将你的网站提交到 <a class=\"reference external\" href=\"https://hstspreload.org/\">浏览器预加载列表</a> ，请将 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_HSTS_PRELOAD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_HSTS_PRELOAD</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>。这样就会把 <code class=\"docutils literal notranslate\"><span class=\"pre\">preload</span></code> 指令附加到 <code class=\"docutils literal notranslate\"><span class=\"pre\">Strict-Transport-Security</span></code> 头。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>HSTS 策略适用于你的整个域，而不仅仅是你设置响应头的 URL。因此，你应该只在你的整个域名只通过 HTTPS 服务时使用它。</p>\n<p>适当尊重 HSTS 头的浏览器将拒绝允许用户绕过警告，并连接到使用过期、自签名或其他无效 SSL 证书的网站。如果你使用 HSTS，请确保你的证书处于良好状态，并保持这种状态！</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>如果你部署在负载平衡器或反向代理服务器后面，而 <code class=\"docutils literal notranslate\"><span class=\"pre\">Strict-Transport-Security</span></code> 头没有被添加到你的响应中，这可能是因为 Django 没有意识到它是在一个安全的连接上；你可能需要设置 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_PROXY_SSL_HEADER</span></code></a> 设置。</p>\n</aside>\n</section>\n<section id=\"referrer-policy\">\n<span id=\"id4\"></span><h4>Referrer 政策<a class=\"heading-anchor\" href=\"#referrer-policy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>浏览器使用 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referer\">referer 头</a> 作为向网站发送关于用户如何到达那里的信息的一种方式。当用户点击一个链接时，浏览器将发送链接页面的完整 URL 作为 referrer。虽然这对某些目的来说可能很有用——例如查明谁在链接到你的网站——但它也可能引起隐私问题，因为它告诉一个网站，一个用户正在访问另一个网站。</p>\n<p>一些浏览器能够接受关于是否应该在用户点击链接时发送 HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 头的提示；这种提示通过 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy\">Referrer-Policy 头</a> 提供。这个头可以向浏览器建议三种行为中的任何一种：</p>\n<ul class=\"simple\">\n<li><p>完整 URL：在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 头中发送整个URL。例如，如果用户访问 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/page.html</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 头将包含 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://example.com/page.html&quot;</span></code>。</p></li>\n<li><p>仅起源：只发送 referrer 中的“起源”。起源由方案、主机和（可选）端口号组成。例如，如果用户访问的是 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/page.html</span></code>，起源就是 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/</span></code>。</p></li>\n<li><p>无 referrer：完全不发送 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 头。</p></li>\n</ul>\n<p>有两种类型的情况，这个头可以告诉浏览器要注意：</p>\n<ul class=\"simple\">\n<li><p>同源与跨源：从 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/1.html</span></code> 到 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/2.html</span></code> 的链接为同源链接。从 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://example.com/page.html</span></code> 到 <code class=\"docutils literal notranslate\"><span class=\"pre\">https://not.example.com/page.html</span></code> 的链接为跨源链接。</p></li>\n<li><p>协议降级：如果包含链接的页面是通过 HTTPS 服务的，但被链接的页面不是通过 HTTPS 服务的，就会发生降级。</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>当您的网站通过 HTTPS 提供服务时，<a class=\"reference internal\" href=\"/zh-hans/5.2/ref/csrf/#how-csrf-works\"><span class=\"std std-ref\">Django 的 CSRF 保护系统</span></a> 需要存在 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 标头，因此完全禁用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 标头将干扰 CSRF 保护。为了获得禁用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 标头的大部分好处，同时保留 CSRF 保护，请考虑仅启用同源引用。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 可以根据 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_REFERRER_POLICY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_REFERRER_POLICY</span></code></a> 设置，为你设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referrer-Policy</span></code> 头（注意拼写：当用户点击链接时，浏览器会发送一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> 头，但指示浏览器是否这样做的头是拼写为 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referrer-Policy</span></code>）。该设置的有效值为：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">no-referrer</span></code></dt><dd><p>指示浏览器对在本网站上点击的链接不发送 referrer。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">no-referrer-when-downgrade</span></code></dt><dd><p>指示浏览器发送完整的 URL 作为 referrer，但只有在没有发生协议降级的情况下。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">origin</span></code></dt><dd><p>指示浏览器只发送起源，而不是完整的 URL 作为 referrer。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">origin-when-cross-origin</span></code></dt><dd><p>指示浏览器发送完整的 URL 作为同源链接的 referrer，而只发送起源给跨源链接。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">same-origin</span></code></dt><dd><p>指示浏览器发送完整的 URL，但只针对同源链接。对于跨源链接，将不发送 referrer。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">strict-origin</span></code></dt><dd><p>指示浏览器只发送起源，而不是完整的 URL，并在协议降级时不发送 referrer。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">strict-origin-when-cross-origin</span></code></dt><dd><p>当链接为同源且不发生协议降级时，指示浏览器发送完整的 URL；当链接为跨源且不发生协议降级时，只发送起源；当发生协议降级时，不发送 referrer。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">unsafe-url</span></code></dt><dd><p>指示浏览器始终发送完整的 URL 作为 referrer。</p>\n</dd>\n</dl>\n<aside class=\"admonition-unknown-policy-values admonition\">\n<p class=\"admonition-title\">未知政策值</p>\n<p>当一个策略值被用户代理认为 <a class=\"reference external\" href=\"https://w3c.github.io/webappsec-referrer-policy/#unknown-policy-values\">未知</a> 时，可以指定多个策略值以提供后备。最后一个被理解的指定值优先。为了支持这一点，可以在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_REFERRER_POLICY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_REFERRER_POLICY</span></code></a> 中使用一个可迭代对象或逗号分隔的字符串。</p>\n</aside>\n</section>\n<section id=\"cross-origin-opener-policy\">\n<span id=\"id8\"></span><h4>跨域开启策略<a class=\"heading-anchor\" href=\"#cross-origin-opener-policy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一些浏览器可以通过根据 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Opener-Policy\">Cross-Origin Opener Policy</a> （COOP）标头的值将顶级窗口与其他文档隔离开来，将它们放入单独的浏览上下文组中。如果以这种方式隔离的文档打开一个跨源弹出窗口，弹出窗口的 <code class=\"docutils literal notranslate\"><span class=\"pre\">window.opener</span></code> 属性将为 <code class=\"docutils literal notranslate\"><span class=\"pre\">null</span></code>。使用 COOP 隔离窗口是一种深度防御，可有效防止跨源攻击，特别是像 Spectre 这样允许数据泄漏到共享浏览上下文中的攻击。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 可以根据 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_CROSS_ORIGIN_OPENER_POLICY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CROSS_ORIGIN_OPENER_POLICY</span></code></a> 设置为您设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">Cross-Origin-Opener-Policy</span></code> 标头。此设置的有效值包括：</p>\n<dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">same-origin</span></code></dt><dd><p>将浏览上下文专门隔离为同源文档。不会在同一浏览上下文中加载跨源文档。这是默认和最安全的选项。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">same-origin-allow-popups</span></code></dt><dd><p>将浏览上下文隔离为同源文档或那些不设置 COOP 或通过设置 COOP 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">unsafe-none</span></code> 来选择退出隔离的文档。</p>\n</dd>\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">unsafe-none</span></code></dt><dd><p>允许文档被添加到其打开者的浏览上下文组，除非打开者本身具有 COOP 为 <code class=\"docutils literal notranslate\"><span class=\"pre\">same-origin</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">same-origin-allow-popups</span></code> 的设置。</p>\n</dd>\n</dl>\n</section>\n<section id=\"x-content-type-options-nosniff\">\n<span id=\"x-content-type-options\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">X-Content-Type-Options:</span> <span class=\"pre\">nosniff</span></code><a class=\"heading-anchor\" href=\"#x-content-type-options-nosniff\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>一些浏览器会试图猜测它们获取的资源的内容类型，覆盖 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Type</span></code> 头。虽然这可以帮助显示配置不当的服务器的网站，但也会带来安全风险。</p>\n<p>如果你的网站提供用户上传的文件，恶意用户可能会上传一个特制的文件，当你认为它是无害的东西时，该文件会被浏览器解释为 HTML 或 JavaScript。</p>\n<p>为了防止浏览器猜测内容类型，并迫使它总是使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Type</span></code> 头中提供的类型，你可以传递 <a class=\"reference external\" href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Content-Type-Options\">X-Content-Type-Options: nosniff</a> 头。 如果 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_CONTENT_TYPE_NOSNIFF\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_CONTENT_TYPE_NOSNIFF</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，<code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 将对所有的响应进行这样的操作。</p>\n<p>请注意，在大多数部署情况下，如果 Django 不涉及提供用户上传的文件，这个设置不会对您有所帮助。例如，如果您的 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a> 直接由您的前端 Web 服务器（nginx、Apache 等）提供服务，那么您需要在那里设置此标头。另一方面，如果您正在使用 Django 来执行某些操作，比如要求授权以下载文件，并且无法在 Web 服务器中设置标头，那么这个设置将会有用。</p>\n</section>\n<section id=\"ssl-redirect\">\n<span id=\"id11\"></span><h4>SSL 重定向<a class=\"heading-anchor\" href=\"#ssl-redirect\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>如果你的网站同时提供 HTTP 和 HTTPS 连接，大多数用户最终会默认使用不安全的连接。为了达到最佳的安全性，你应该将所有的 HTTP 连接重定向到 HTTPS。</p>\n<p>如果你将 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_SSL_REDIRECT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_SSL_REDIRECT</span></code></a> 设置为 True，<code class=\"docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code> 将永久（HTTP 301）重定向所有 HTTP 连接到 HTTPS。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>出于性能方面的考虑，最好在 Django 之外，在前端负载均衡器或反向代理服务器（如 <a class=\"reference external\" href=\"https://nginx.org/\">nginx</a> ）中做这些重定向。 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_SSL_REDIRECT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_SSL_REDIRECT</span></code></a> 是为了在部署情况下，这不是一个选项。</p>\n</aside>\n<p>如果 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_SSL_HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_SSL_HOST</span></code></a> 设置有一个值，所有的重定向将被发送到该主机，而不是最初要求的主机。</p>\n<p>如果你的网站上有几个页面应该通过 HTTP 提供，而不是重定向到 HTTPS，你可以在 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_REDIRECT_EXEMPT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_REDIRECT_EXEMPT</span></code></a> 设置中列出正则表达式来匹配这些 URL。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>如果你部署在负载均衡器或反向代理服务器后面，而 Django 似乎无法判断一个请求是否真的已经安全，你可能需要设置 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-SECURE_PROXY_SSL_HEADER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SECURE_PROXY_SSL_HEADER</span></code></a> 配置。</p>\n</aside>\n</section>\n</section>\n<section id=\"module-django.contrib.sessions.middleware\">\n<span id=\"session-middleware\"></span><h3>会话中间件<a class=\"heading-anchor\" href=\"#module-django.contrib.sessions.middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sessions.middleware.SessionMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SessionMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sessions.middleware.SessionMiddleware\"><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/5.2/topics/http/sessions/\"><span class=\"doc\">会话文档</span></a>。</p>\n</section>\n<section id=\"module-django.contrib.sites.middleware\">\n<span id=\"site-middleware\"></span><h3>站点中间件<a class=\"heading-anchor\" href=\"#module-django.contrib.sites.middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.sites.middleware.CurrentSiteMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CurrentSiteMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.sites.middleware.CurrentSiteMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将代表当前站点的 <code class=\"docutils literal notranslate\"><span class=\"pre\">site</span></code> 属性添加到每个传入的 <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 对象中。参见 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/sites/#site-middleware\"><span class=\"std std-ref\">站点文档</span></a>。</p>\n</section>\n<section id=\"module-django.contrib.auth.middleware\">\n<span id=\"authentication-middleware\"></span><h3>验证中间件<a class=\"heading-anchor\" href=\"#module-django.contrib.auth.middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.AuthenticationMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AuthenticationMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.AuthenticationMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>将 <code class=\"docutils literal notranslate\"><span class=\"pre\">user</span></code> 属性添加到每个传入的 <code class=\"docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code> 对象中，表示当前已登录的用户。请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#auth-web-requests\"><span class=\"std std-ref\">Web 请求中的身份验证</span></a>。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.LoginRequiredMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">LoginRequiredMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>子类化中间件并覆盖以下属性和方法以自定义未认证请求的行为。</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.LoginRequiredMiddleware.redirect_field_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">redirect_field_name</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware.redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>默认为 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;next&quot;</span></code>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.LoginRequiredMiddleware.get_login_url\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_login_url</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware.get_login_url\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回未认证请求将重定向到的 URL。此结果是 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> 装饰器上设置的 <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url``（如果不是</span> <span class=\"pre\">``None</span></code>），或 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.LoginRequiredMiddleware.get_redirect_field_name\">\n<span class=\"sig-name descname\"><span class=\"pre\">get_redirect_field_name</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware.get_redirect_field_name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回包含用户成功登录后应重定向到的 URL 的查询参数的名称。此结果是 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> 装饰器上设置的 <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name``（如果不是</span> <span class=\"pre\">``None</span></code>），或 <a class=\"reference internal\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware.redirect_field_name\" title=\"django.contrib.auth.middleware.LoginRequiredMiddleware.redirect_field_name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code></a>。如果返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，则不会添加查询参数。</p>\n</dd></dl>\n\n</dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p>将所有未认证请求重定向到登录页面，除了使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#django.contrib.auth.decorators.login_not_required\" title=\"django.contrib.auth.decorators.login_not_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_not_required()</span></code></a> 排除的视图。登录页面默认为 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-LOGIN_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">settings.LOGIN_URL</span></code></a>，但可以自定义。</p>\n<p>通过将其添加到 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 设置中 <strong>之后</strong> <a class=\"reference internal\" href=\"#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</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=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.AuthenticationMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.LoginRequiredMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;...&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#django.contrib.auth.decorators.login_not_required\" title=\"django.contrib.auth.decorators.login_not_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_not_required()</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.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_not_required</span>\n\n\n<span class=\"nd\">@login_not_required</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">contact_us</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#django.contrib.auth.decorators.login_required\" title=\"django.contrib.auth.decorators.login_required\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">login_required()</span></code></a> 装饰器自定义认证视图的登录 URL 或字段名称，分别设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">login_url</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_field_name</span></code>。例如：</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.contrib.auth.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">login_required</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">method_decorator</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">View</span>\n\n\n<span class=\"nd\">@login_required</span><span class=\"p\">(</span><span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;/books/login/&quot;</span><span class=\"p\">,</span> <span class=\"n\">redirect_field_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;redirect_to&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">book_dashboard</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"nd\">@method_decorator</span><span class=\"p\">(</span>\n    <span class=\"n\">login_required</span><span class=\"p\">(</span><span class=\"n\">login_url</span><span class=\"o\">=</span><span class=\"s2\">&quot;/books/login/&quot;</span><span class=\"p\">,</span> <span class=\"n\">redirect_field_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;redirect_to&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;dispatch&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">BookMetrics</span><span class=\"p\">(</span><span class=\"n\">View</span><span class=\"p\">):</span>\n    <span class=\"k\">pass</span>\n</code></pre></div>\n<aside class=\"admonition-ensure-that-your-login-view-does-not-require-a-login admonition\">\n<p class=\"admonition-title\">确保你的登录视图不需要登录。</p>\n<p>为了防止无限重定向，请确保你已 <a class=\"reference internal\" href=\"/zh-hans/5.2/topics/auth/default/#disable-login-required-middleware-for-views\"><span class=\"std std-ref\">启用未认证请求</span></a> 到你的登录视图。</p>\n</aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.RemoteUserMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RemoteUserMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.RemoteUserMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>用于利用 Web 服务器提供的身份验证的中间件。有关使用详细信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/howto/auth-remote-user/\"><span class=\"doc\">使用 REMOTE_USER 进行身份验证</span></a>。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.auth.middleware.PersistentRemoteUserMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">PersistentRemoteUserMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.contrib.auth.middleware.PersistentRemoteUserMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>中间件用于在仅在登录页面启用时利用 Web 服务器提供的身份验证。有关使用详细信息，请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/howto/auth-remote-user/#persistent-remote-user-middleware-howto\"><span class=\"std std-ref\">仅在登录界面使用 REMOTE_USER</span></a>。</p>\n</section>\n<section id=\"csrf-protection-middleware\">\n<h3>CSRF 保护中间件<a class=\"heading-anchor\" href=\"#csrf-protection-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.csrf.CsrfViewMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CsrfViewMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.csrf.CsrfViewMiddleware\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>通过在 POST 表单中添加隐藏的表单字段，并检查请求的正确值，增加对跨站点伪造请求的保护。请参阅 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/csrf/\"><span class=\"doc\">跨站点伪造请求保护文档</span></a>。</p>\n<p>You can add Cross Site Request Forgery protection to individual views using the\n<a class=\"reference internal\" href=\"/zh-hans/5.2/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_protect()</span></code></a> decorator.</p>\n</section>\n<section id=\"x-frame-options-middleware\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">X-Frame-Options</span></code> 中间件<a class=\"heading-anchor\" href=\"#x-frame-options-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.middleware.clickjacking.XFrameOptionsMiddleware\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">XFrameOptionsMiddleware</span></span><a class=\"heading-anchor\" href=\"#django.middleware.clickjacking.XFrameOptionsMiddleware\"><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/5.2/ref/clickjacking/\"><span class=\"doc\">通过 X-Frame-Options 头的点击劫持保护</span></a>。</p>\n</section>\n</section>\n<section id=\"middleware-ordering\">\n<span id=\"id12\"></span><h2>中间件顺序<a class=\"heading-anchor\" href=\"#middleware-ordering\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>下面是关于各种 Django 中间件类的排序的一些提示：</p>\n<ol class=\"arabic\">\n<li><p><a class=\"reference internal\" href=\"#django.middleware.security.SecurityMiddleware\" title=\"django.middleware.security.SecurityMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SecurityMiddleware</span></code></a></p>\n<p>如果你要开启 SSL 重定向，它应该排在列表的最前面，因为这样可以避免运行一堆其他不必要的中间件。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.cache.UpdateCacheMiddleware\" title=\"django.middleware.cache.UpdateCacheMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code></a></p>\n<p>在修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> 头（<code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>）之前。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.gzip.GZipMiddleware\" title=\"django.middleware.gzip.GZipMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code></a></p>\n<p>在任何可能改变或使用响应体的中间件之前。</p>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> 之后：修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> 头。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.sessions.middleware.SessionMiddleware\" title=\"django.contrib.sessions.middleware.SessionMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code></a></p>\n<p>在任何可能引发异常触发错误视图的中间件之前（如 <a class=\"reference internal\" href=\"/zh-hans/5.2/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>），如果你使用的是 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-CSRF_USE_SESSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_USE_SESSIONS</span></code></a>。</p>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> 之后：修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> 头。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConditionalGetMiddleware</span></code></a></p>\n<p>在任何可能改变响应的中间件之前（它设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> 头）。</p>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code> 之后，这样它就不会在 gzip 压缩后的内容上计算 <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> 头。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code></a></p>\n<p>最上面的一个，仅次于 <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> （使用会话数据）和 <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> （修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> 头）。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.common.CommonMiddleware\" title=\"django.middleware.common.CommonMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code></a></p>\n<p>在任何可能改变响应的中间件之前（它设置 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Length</span></code> 头）。出现在 <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code> 之前并改变响应的中间件必须重置 <code class=\"docutils literal notranslate\"><span class=\"pre\">Content-Length</span></code>。</p>\n<p>靠近顶部：当 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-APPEND_SLASH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">APPEND_SLASH</span></code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-PREPEND_WWW\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PREPEND_WWW</span></code></a> 设置为 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> 时，它会重定向。</p>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 之后，如果你使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-CSRF_USE_SESSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_USE_SESSIONS</span></code></a>。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CsrfViewMiddleware</span></code></a></p>\n<p>在任何假设 CSRF 攻击已经被处理的视图中间件之前。</p>\n<p>在 <a class=\"reference internal\" href=\"#django.contrib.auth.middleware.RemoteUserMiddleware\" title=\"django.contrib.auth.middleware.RemoteUserMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RemoteUserMiddleware</span></code></a>，或任何其他可能执行登录的认证中间件，从而旋转 CSRF 令牌，然后再向下调用中间件链。</p>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 之后，如果你使用 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/settings/#std-setting-CSRF_USE_SESSIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_USE_SESSIONS</span></code></a>。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 之后：使用会话存储。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.auth.middleware.LoginRequiredMiddleware\" title=\"django.contrib.auth.middleware.LoginRequiredMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LoginRequiredMiddleware</span></code></a></p>\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p>在 <code class=\"docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code> 之后：使用用户对象。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.contrib.messages.middleware.MessageMiddleware\" title=\"django.contrib.messages.middleware.MessageMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MessageMiddleware</span></code></a></p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> 之后：可以使用基于会话的存储。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"#django.middleware.cache.FetchFromCacheMiddleware\" title=\"django.middleware.cache.FetchFromCacheMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code></a></p>\n<p>在任何修改 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> 头的中间件之后：该头用于为缓存哈希键选取一个值。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/flatpages/#django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\" title=\"django.contrib.flatpages.middleware.FlatpageFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FlatpageFallbackMiddleware</span></code></a></p>\n<p>应该是接近底部，因为这是一种最后的中间件。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/redirects/#django.contrib.redirects.middleware.RedirectFallbackMiddleware\" title=\"django.contrib.redirects.middleware.RedirectFallbackMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RedirectFallbackMiddleware</span></code></a></p>\n<p>应该是接近底部，因为这是一种最后的中间件。</p>\n</li>\n</ol>\n</section>","rootId":"module-django.middleware","toc":[{"title":"可用的中间件","anchor":"available-middleware","children":[{"title":"缓存中间件","anchor":"module-django.middleware.cache","children":[]},{"title":"“通用”中间件","anchor":"module-django.middleware.common","children":[]},{"title":"GZip 中间件","anchor":"module-django.middleware.gzip","children":[]},{"title":"条件 GET 中间件","anchor":"module-django.middleware.http","children":[]},{"title":"本地化中间件","anchor":"module-django.middleware.locale","children":[]},{"title":"消息中间件","anchor":"module-django.contrib.messages.middleware","children":[]},{"title":"安全中间件","anchor":"module-django.middleware.security","children":[{"title":"HTTP 严格传输安全","anchor":"http-strict-transport-security","children":[]},{"title":"Referrer 政策","anchor":"referrer-policy","children":[]},{"title":"跨域开启策略","anchor":"cross-origin-opener-policy","children":[]},{"title":"X-Content-Type-Options: nosniff","anchor":"x-content-type-options-nosniff","children":[]},{"title":"SSL 重定向","anchor":"ssl-redirect","children":[]}]},{"title":"会话中间件","anchor":"module-django.contrib.sessions.middleware","children":[]},{"title":"站点中间件","anchor":"module-django.contrib.sites.middleware","children":[]},{"title":"验证中间件","anchor":"module-django.contrib.auth.middleware","children":[]},{"title":"CSRF 保护中间件","anchor":"csrf-protection-middleware","children":[]},{"title":"X-Frame-Options 中间件","anchor":"x-frame-options-middleware","children":[]}]},{"title":"中间件顺序","anchor":"middleware-ordering","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/5.2/ref/"}],"prev":{"docname":"ref/logging","title":"日志","url":"/zh-hans/5.2/ref/logging/"},"next":{"docname":"ref/migration-operations","title":"迁移操作","url":"/zh-hans/5.2/ref/migration-operations/"},"formats":{"html":"/zh-hans/5.2/ref/middleware/","markdown":"/zh-hans/5.2/ref/middleware.md","json":"/zh-hans/5.2/ref/middleware.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/middleware.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/ref/middleware/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}