{"title":"ミドルウェア (Middleware)","version":"3.1","locale":"ja","docname":"topics/http/middleware","url":"/ja/3.1/topics/http/middleware/","canonical":"https://djangodocs.dev/ja/3.1/topics/http/middleware/","summary":"ミドルウェアは、Django のリクエスト/レスポンス処理にフックを加えるためのフレームワークです。これは、Django の入力あるいは出力をグローバルに置き換えるための、軽量で低レベルの「プラグイン」システムです。 各ミドルウェアのコンポーネントは、それぞれある特定の機能を実行する役目を持っています。たとえば、Django…","html":"<h1>ミドルウェア (Middleware)<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>ミドルウェアは、Django のリクエスト/レスポンス処理にフックを加えるためのフレームワークです。これは、Django の入力あるいは出力をグローバルに置き換えるための、軽量で低レベルの「プラグイン」システムです。</p>\n<p>各ミドルウェアのコンポーネントは、それぞれある特定の機能を実行する役目を持っています。たとえば、Django には <a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#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>このドキュメントでは、ミドルウェアが機能するしくみ、ミドルウェアを有効にする方法、そして、自分でミドルウェアを書く方法について説明します。Django には組み込みのミドルウェアがいくつか用意されているので、自分で書かなくてもすぐに使い始めることができます。これらの組み込みのミドルウェアについては、<a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/\"><span class=\"doc\">組み込みミドルウェアリファレンス</span></a> にドキュメントされているので参照してください。</p>\n<section id=\"writing-your-own-middleware\">\n<h2>自分でミドルウェアを書く<a class=\"heading-anchor\" href=\"#writing-your-own-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ミドルウェアファクトリは、ミドルウェアを返す <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> を取る呼び出し可能なオブジェクトです。ミドルウェアは (ビューと同じように) リクエストを受け取ってレスポンスを返す呼び出し可能なオブジェクトです。</p>\n<p>ミドルウェアは、以下のように関数として書くことができます:</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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">simple_middleware</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n    <span class=\"c1\"># One-time configuration and initialization.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Code to be executed for each request before</span>\n        <span class=\"c1\"># the view (and later middleware) are called.</span>\n\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Code to be executed for each request/response after</span>\n        <span class=\"c1\"># the view is called.</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">middleware</span>\n</code></pre></div>\n<p>もしくは、インスタンスを呼び出し可能なクラスとして書くこともできます:</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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SimpleMiddleware</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">get_response</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span>\n        <span class=\"c1\"># One-time configuration and initialization.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Code to be executed for each request before</span>\n        <span class=\"c1\"># the view (and later middleware) are called.</span>\n\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Code to be executed for each request/response after</span>\n        <span class=\"c1\"># the view is called.</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Django によって渡される <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> 呼び出し可能オブジェクトは、実際の (これがミドルウェアの最後にリストアップされている場合) ビューか、チェーン内の次のミドルウェアの可能性があります。現在のミドルウェアはこれが何かを知る必要も気にする必要もなく、ただ次に来るものを表します。</p>\n<p>上記は、わずかに単純化したものです -- チェーン内の際にリストアップされたミドルウェアに対する <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> は実際のビューではなく <a class=\"reference internal\" href=\"#view-middleware\"><span class=\"std std-ref\">ビューミドルウェア</span></a> を適用する処理を行うハンドラからのラッパーメソッドです。これは適切な URL 属性でビューを呼び出し、<a class=\"reference internal\" href=\"#template-response-middleware\"><span class=\"std std-ref\">テンプレートレスポンス</span></a> と <a class=\"reference internal\" href=\"#exception-middleware\"><span class=\"std std-ref\">例外</span></a> を適用します。</p>\n<p>Middleware can either support only synchronous Python (the default), only\nasynchronous Python, or both. See <a class=\"reference internal\" href=\"#async-middleware\"><span class=\"std std-ref\">非同期サポート</span></a> for details of how to\nadvertise what you support, and know what kind of request you are getting.</p>\n<p>ミドルウェアは、あなたの Ptyhon パスのどこでも使うことができます。</p>\n<section id=\"init-get-response\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__init__(get_response)</span></code><a class=\"heading-anchor\" href=\"#init-get-response\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ミドルウェアファクトリは <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> 引数を受け取る必要があります。ミドルウェアに対してグローバルな宣言を初期化することもできます。いくつかの注意事項があります:</p>\n<ul class=\"simple\">\n<li><p>Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> 引数でミドルウェアを初期化するため、<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> で他の引数を必須にすることはできません。</p></li>\n<li><p>リクエストごとに 1 回呼ばれる <code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code> メソッドとは異なり、<code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> はウェブサーバが起動したときに <em>1回だけ</em> 呼ばれます。</p></li>\n</ul>\n</section>\n<section id=\"marking-middleware-as-unused\">\n<h3>ミドルウェアを不使用としてマークする<a class=\"heading-anchor\" href=\"#marking-middleware-as-unused\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>起動時にミドルウェアを使うかどうかを決めることは、ときに有用です。この場合、ミドルウェアの <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> メソッドが <a class=\"reference internal\" href=\"/ja/3.1/ref/exceptions/#django.core.exceptions.MiddlewareNotUsed\" title=\"django.core.exceptions.MiddlewareNotUsed\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MiddlewareNotUsed</span></code></a> を投げる可能性があります。Django はミドルウェアプロセスからこのミドルウェアを削除し、<a class=\"reference internal\" href=\"/ja/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> のときはデバッグメッセージを <a class=\"reference internal\" href=\"/ja/3.1/topics/logging/#django-request-logger\"><span class=\"std std-ref\">django.request</span></a> ロガーに記録します。</p>\n</section>\n</section>\n<section id=\"activating-middleware\">\n<h2>ミドルウェアを有効にする<a class=\"heading-anchor\" href=\"#activating-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ミドルウェア要素をアクティブ化するには、Django の設定内の <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> リストに追加してください。</p>\n<p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> では、各ミドルウェア要素は文字列で表されます: ミドルウェアファクトリのクラスや関数名に対する完全な Python パスです。 例えば、以下は <a class=\"reference internal\" href=\"/ja/3.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</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=\"s1\">&#39;django.middleware.security.SecurityMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.common.CommonMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.csrf.CsrfViewMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth.middleware.AuthenticationMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages.middleware.MessageMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.clickjacking.XFrameOptionsMiddleware&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Django の導入では、ミドルウェアは必須ではありません — お望みならば <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> は空でも構いません — しかし、最低でも <a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#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>ミドルウェアは他のミドルウェアに依存するため、<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> の順番は重要です。<a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#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> はセッション内に認証済みユーザを保持します。したがって、<a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#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> の後に起動する必要があります。Django のミドルウェアクラスの順番については、<a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#middleware-ordering\"><span class=\"std std-ref\">Middleware の順序</span></a> を参照してください。</p>\n</section>\n<section id=\"middleware-order-and-layering\">\n<h2>ミドルウェアの順番とレイヤ<a class=\"heading-anchor\" href=\"#middleware-order-and-layering\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>ビューを呼び出す前、リクエストの段階で、Django は <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 内で定義された順番で上から下に向かってミドルウェアを適用します。</p>\n<p>これはタマネギのように考えることができます: 各ミドルウェアクラスは、タマネギの中心にあるビューをラップする &quot;レイヤ&quot; です。リクエストがタマネギのすべてのレイヤ (つまり中心にあるビューにいたる全ての道) を通過すると (各レイヤーは <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> を呼び出してリクエストを次のレイヤに渡します)、レスポンスは各レイヤーを (逆順で) 通過して戻ります。</p>\n<p>いずれかのレイヤが短絡し、<code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> を呼び出さずにレスポンスを返すことを決定した場合、そのレイヤの内側にあるタマネギの (ビューを含む) レイヤはリクエストおよびレスポンスを受け取りません。 レスポンスは、リクエストが通過したのと同じレイヤーを介してのみ返されます。</p>\n</section>\n<section id=\"other-middleware-hooks\">\n<h2>他のミドルウェアのフック<a class=\"heading-anchor\" href=\"#other-middleware-hooks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>上述した基本的なリクエストやレスポンスのミドルウェアパターンのほかに、3 つの特殊なメソッドをクラスベースのミドルウェアに追加することができます:</p>\n<section id=\"process-view\">\n<span id=\"view-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code><a class=\"heading-anchor\" href=\"#process-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_view\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_view</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\">view_func</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_args</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_view\"><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\">request</span></code> は <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> クラスのオブジェクトです。<code class=\"docutils literal notranslate\"><span class=\"pre\">view_func</span></code> は、直後に Django が使用する Python の関数です (関数の名前の文字列ではなく、実際の関数オブジェクトです)。<code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> はビューに渡される位置引数のリスト、<code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> はビューに渡されるキーワード引数のディクショナリです。<code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> も <code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> も、第一引数 (<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>) を含んでいません。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> は、Django がビューを呼び出す直前に呼び出されます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> もしくは <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> オブジェクトを返す必要があります。<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を返す場合、Django はこのリクエストの処理を続け、他のすべての <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> ミドルウェアを実行し、さらに適切なビューを実行します。<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> オブジェクトを返す場合、Django はわざわざ適切なビューを呼び出すことはしません; レスポンスミドルウェアを <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> に適用し、結果を返します。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>ビューが実行される、ミドルウェアの内側もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> 内の <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> にアクセスすると、ミドルウェアの後に実行される全てのビューが <a class=\"reference internal\" href=\"/ja/3.1/topics/http/file-uploads/#modifying-upload-handlers-on-the-fly\"><span class=\"std std-ref\">リクエストに対するアップロードハンドラを修正する</span></a> ことができなくなるため、通常は避けられるべきです。</p>\n<p><a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#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> クラスだけは例外と考えていいでしょう。というのも、このミドルウェアには、<a class=\"reference internal\" href=\"/ja/3.1/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_exempt()</span></code></a> と <a class=\"reference internal\" href=\"/ja/3.1/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> というデコレータが用意されていて、このデコレータを使えば、CSRF の検証が必要になったどの時点でも、明示的にビューを制御できるからです。</p>\n</aside>\n</section>\n<section id=\"process-exception\">\n<span id=\"exception-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code><a class=\"heading-anchor\" href=\"#process-exception\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_exception\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_exception</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><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_exception\"><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\">request</span></code> は <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> オブジェクトです。<code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code> は、ビュー関数から投げられた <code class=\"docutils literal notranslate\"><span class=\"pre\">Exception</span></code> オブジェクトです。</p>\n<p>Django calls <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> when a view raises an exception.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> should return either <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> or an\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> object. If it returns an\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> object, the template response and response\nmiddleware will be applied and the resulting response returned to the\nbrowser. Otherwise, <a class=\"reference internal\" href=\"/ja/3.1/ref/views/#error-views\"><span class=\"std std-ref\">default exception handling</span></a> kicks in.</p>\n<p>Again, middleware are run in reverse order during the response phase, which\nincludes <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>. If an exception middleware returns a response,\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code> methods of the middleware classes above that\nmiddleware won't be called at all.</p>\n</section>\n<section id=\"process-template-response\">\n<span id=\"template-response-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code><a class=\"heading-anchor\" href=\"#process-template-response\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_template_response\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_template_response</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\">response</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_template_response\"><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\">request</span></code> は <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> クラスのオブジェクトです。<code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> は、Django のビューまたはミドルウェアから返される、<a class=\"reference internal\" href=\"/ja/3.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> クラスのオブジェクト (あるいはそれと同等なもの) です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code> は、レスポンスオブジェクトが <code class=\"docutils literal notranslate\"><span class=\"pre\">r</span>\n<span class=\"pre\">ender()</span></code> メソッドを持っている場合、つまり、<a class=\"reference internal\" href=\"/ja/3.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> クラスのオブジェクト (あるいはそれと同等のもの) である場合に、ビューの実行の直後に呼ばれます。</p>\n<p>このメソッドは、<code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code> メソッドを実装したレスポンスオブジェクトでなければなりません。このメソッド内では、与えられた <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">response.template_name</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">response.context_data</span></code> を修正したり、あるいは、新規に <a class=\"reference internal\" href=\"/ja/3.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> クラスのオブジェクト (あるいはそれと同等なもの) を作成したりすることができます。</p>\n<p>ただし、レスポンスを自分でレンダリング (render) する必要はありません。なぜなら、レスポンスオブジェクトは、すべてのテンプレートレスポンスミドルウェアが呼び出された後に、自動的にレンダリングされるからです。</p>\n<p>レスポンスフェーズでは、ミドルウェアは逆順に呼び出されます。これには、<code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code> も含まれます。</p>\n</section>\n</section>\n<section id=\"dealing-with-streaming-responses\">\n<h2>ストリーミングレスポンス (streaming responses) を扱う<a class=\"heading-anchor\" href=\"#dealing-with-streaming-responses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> とは違い、<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> 属性を持ちません。そのため、ミドルウェアはもはや、すべてのレスポンスが <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code> 属性を持っていることを前提にすることができなくなります。したがって、content にアクセスする必要がある場合には、レスポンスオブジェクトがストリーミングレスポンスオブジェクトかどうかをチェックし、その結果によって処理を場合分けしなければなりません。</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=\"k\">if</span> <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming</span><span class=\"p\">:</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</span> <span class=\"o\">=</span> <span class=\"n\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</span><span class=\"p\">)</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">content</span> <span class=\"o\">=</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">content</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">streaming_content</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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">content</span><span class=\"p\">):</span>\n    <span class=\"k\">for</span> <span class=\"n\">chunk</span> <span class=\"ow\">in</span> <span class=\"n\">content</span><span class=\"p\">:</span>\n        <span class=\"k\">yield</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">chunk</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"exception-handling\">\n<h2>Exception handling<a class=\"heading-anchor\" href=\"#exception-handling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django automatically converts exceptions raised by the view or by middleware\ninto an appropriate HTTP response with an error status code. <a class=\"reference internal\" href=\"/ja/3.1/ref/views/#error-views\"><span class=\"std std-ref\">Certain\nexceptions</span></a> are converted to 4xx status codes, while an unknown\nexception is converted to a 500 status code.</p>\n<p>This conversion takes place before and after each middleware (you can think of\nit as the thin film in between each layer of the onion), so that every\nmiddleware can always rely on getting some kind of HTTP response back from\ncalling its <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> callable. Middleware don't need to worry about\nwrapping their call to <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> in a <code class=\"docutils literal notranslate\"><span class=\"pre\">try/except</span></code> and handling an\nexception that might have been raised by a later middleware or the view. Even\nif the very next middleware in the chain raises an\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a> exception, for example, your middleware won't see\nthat exception; instead it will get an <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>\nobject with a <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse.status_code\" title=\"django.http.HttpResponse.status_code\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">status_code</span></code></a> of 404.</p>\n</section>\n<section id=\"asynchronous-support\">\n<span id=\"async-middleware\"></span><h2>非同期サポート<a class=\"heading-anchor\" href=\"#asynchronous-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"3.1\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>Middleware can support any combination of synchronous and asynchronous\nrequests. Django will adapt requests to fit the middleware's requirements if it\ncannot support both, but at a performance penalty.</p>\n<p>By default, Django assumes that your middleware is capable of handling only\nsynchronous requests. To change these assumptions, set the following attributes\non your middleware factory function or class:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sync_capable</span></code> is a boolean indicating if the middleware can handle\nsynchronous requests. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">async_capable</span></code> is a boolean indicating if the middleware can handle\nasynchronous requests. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p></li>\n</ul>\n<p>If your middleware has both <code class=\"docutils literal notranslate\"><span class=\"pre\">sync_capable</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">async_capable</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>, then Django will pass it the request without\nconverting it. In this case, you can work out if your middleware will receive\nasync requests by checking if the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> object you are passed is a\ncoroutine function, using <code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">asyncio.iscoroutinefunction()</span></code>.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.decorators</span></code> module contains\n<a class=\"reference internal\" href=\"/ja/3.1/ref/utils/#django.utils.decorators.sync_only_middleware\" title=\"django.utils.decorators.sync_only_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sync_only_middleware()</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/3.1/ref/utils/#django.utils.decorators.async_only_middleware\" title=\"django.utils.decorators.async_only_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">async_only_middleware()</span></code></a>, and\n<a class=\"reference internal\" href=\"/ja/3.1/ref/utils/#django.utils.decorators.sync_and_async_middleware\" title=\"django.utils.decorators.sync_and_async_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sync_and_async_middleware()</span></code></a> decorators that\nallow you to apply these flags to middleware factory functions.</p>\n<p>The returned callable must match the sync or async nature of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> method. If you have an asynchronous <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>, you must\nreturn a coroutine function (<code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code>).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>\nmethods, if they are provided, should also be adapted to match the sync/async\nmode. However, Django will individually adapt them as required if you do not,\nat an additional performance penalty.</p>\n<p>Here's an example of how to create a middleware function that supports both:</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\">import</span><span class=\"w\"> </span><span class=\"nn\">asyncio</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\">sync_and_async_middleware</span>\n\n<span class=\"nd\">@sync_and_async_middleware</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">simple_middleware</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n    <span class=\"c1\"># One-time configuration and initialization goes here.</span>\n    <span class=\"k\">if</span> <span class=\"n\">asyncio</span><span class=\"o\">.</span><span class=\"n\">iscoroutinefunction</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n        <span class=\"k\">async</span> <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n            <span class=\"c1\"># Do something here!</span>\n            <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n            <span class=\"c1\"># Do something here!</span>\n            <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">middleware</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>If you declare a hybrid middleware that supports both synchronous and\nasynchronous calls, the kind of call you get may not match the underlying\nview. Django will optimize the middleware call stack to have as few\nsync/async transitions as possible.</p>\n<p>Thus, even if you are wrapping an async view, you may be called in sync\nmode if there is other, synchronous middleware between you and the view.</p>\n</aside>\n</section>\n<section id=\"upgrading-pre-django-1-10-style-middleware\">\n<span id=\"upgrading-middleware\"></span><h2>Django 1.10 以前のスタイルのミドルウェアをアップグレードする<a class=\"heading-anchor\" href=\"#upgrading-pre-django-1-10-style-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.deprecation.MiddlewareMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">django.utils.deprecation.</span></span><span class=\"sig-name descname\"><span class=\"pre\">MiddlewareMixin</span></span><a class=\"heading-anchor\" href=\"#django.utils.deprecation.MiddlewareMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Django provides <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.deprecation.MiddlewareMixin</span></code> to ease creating\nmiddleware classes that are compatible with both <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> and the\nold <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, and support synchronous and asynchronous requests.\nAll middleware classes included with Django are compatible with both settings.</p>\n<p>The mixin provides an <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> method that requires a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>\nargument and stores it in <code class=\"docutils literal notranslate\"><span class=\"pre\">self.get_response</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code> メソッド:</p>\n<ol class=\"arabic simple\">\n<li><p>(定義されている場合) <code class=\"docutils literal notranslate\"><span class=\"pre\">self.process_request(request)</span></code> を呼び出します。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">self.get_response(request)</span></code> を呼び出し、後のミドルウェアとビューからレスポンスを得ます。</p></li>\n<li><p>(定義されている場合) <code class=\"docutils literal notranslate\"><span class=\"pre\">self.process_response(request,</span> <span class=\"pre\">response)</span></code> を呼び出します。</p></li>\n<li><p>レスポンスを返します。</p></li>\n</ol>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code> で使われている場合は、<code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code> メソッドは決して使われません; Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code> を直接呼び出します。</p>\n<p>ほとんどの場合、この mixin を継承することで、旧式のミドルウェアと十分な下位互換性を持つ新しいシステムと互換性を持たせることができます。 新しい短絡セマンティクスは無害であり、既存のミドルウェアにとっても有益です。 いくつかのケースでは、ミドルウェアクラスは新しいセマンティクスに調整するためにいくつかの変更を必要とすることがあります。</p>\n<p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> と <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code> の動作には以下のような違いがあります。</p>\n<ol class=\"arabic simple\">\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, every middleware will always have its\n<code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code> method called, even if an earlier middleware\nshort-circuited by returning a response from its <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request</span></code>\nmethod. Under <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, middleware behaves more like an onion:\nthe layers that a response goes through on the way out are the same layers\nthat saw the request on the way in. If a middleware short-circuits, only\nthat middleware and the ones before it in <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> will see the\nresponse.</p></li>\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code> is applied to\nexceptions raised from a middleware <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request</span></code> method. Under\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code> applies only to exceptions\nraised from the view (or from the <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code> method of a\n<a class=\"reference internal\" href=\"/ja/3.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a>). Exceptions raised from\na middleware are converted to the appropriate HTTP response and then passed\nto the next middleware.</p></li>\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, if a <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code> method raises\nan exception, the <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code> methods of all earlier middleware are\nskipped and a <code class=\"docutils literal notranslate\"><span class=\"pre\">500</span> <span class=\"pre\">Internal</span> <span class=\"pre\">Server</span> <span class=\"pre\">Error</span></code> HTTP response is always\nreturned (even if the exception raised was e.g. an\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>). Under <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, an exception\nraised from a middleware will immediately be converted to the appropriate\nHTTP response, and then the next middleware in line will see that\nresponse. Middleware are never skipped due to a middleware raising an\nexception.</p></li>\n</ol>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>Support for asynchronous requests was added to the <code class=\"docutils literal notranslate\"><span class=\"pre\">MiddlewareMixin</span></code>.</p>\n</aside>\n</section>","rootId":"middleware","toc":[{"title":"自分でミドルウェアを書く","anchor":"writing-your-own-middleware","children":[{"title":"__init__(get_response)","anchor":"init-get-response","children":[]},{"title":"ミドルウェアを不使用としてマークする","anchor":"marking-middleware-as-unused","children":[]}]},{"title":"ミドルウェアを有効にする","anchor":"activating-middleware","children":[]},{"title":"ミドルウェアの順番とレイヤ","anchor":"middleware-order-and-layering","children":[]},{"title":"他のミドルウェアのフック","anchor":"other-middleware-hooks","children":[{"title":"process_view()","anchor":"process-view","children":[]},{"title":"process_exception()","anchor":"process-exception","children":[]},{"title":"process_template_response()","anchor":"process-template-response","children":[]}]},{"title":"ストリーミングレスポンス (streaming responses) を扱う","anchor":"dealing-with-streaming-responses","children":[]},{"title":"Exception handling","anchor":"exception-handling","children":[]},{"title":"非同期サポート","anchor":"asynchronous-support","children":[]},{"title":"Django 1.10 以前のスタイルのミドルウェアをアップグレードする","anchor":"upgrading-pre-django-1-10-style-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/3.1/topics/"},{"docname":"topics/http/index","title":"HTTP リクエストのハンドリング","url":"/ja/3.1/topics/http/"}],"prev":{"docname":"topics/http/generic-views","title":"ジェネリックビュー (generic view)","url":"/ja/3.1/topics/http/generic-views/"},"next":{"docname":"topics/http/sessions","title":"セッションの使いかた","url":"/ja/3.1/topics/http/sessions/"},"formats":{"html":"/ja/3.1/topics/http/middleware/","markdown":"/ja/3.1/topics/http/middleware.md","json":"/ja/3.1/topics/http/middleware.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/http/middleware.txt","official":"https://docs.djangoproject.com/ja/3.1/topics/http/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","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}