{"title":"条件付きのビュー処理","version":"6.1","locale":"ja","docname":"topics/conditional-view-processing","url":"/ja/6.1/topics/conditional-view-processing/","canonical":"https://djangodocs.dev/ja/6.1/topics/conditional-view-processing/","summary":"HTTP クライアントは、さまざまな HTTPヘッダーを送信することで、受信したリソースについてサーバーに伝えることができます。この方法は、ウェブページを ( GET メソッドを利用して) 取得する際に、すでにクライアントが取得しているデータを送信するのを回避するためによく使われます。しかし、同じヘッダーは、全ての HTTP…","html":"<h1>条件付きのビュー処理<a class=\"heading-anchor\" href=\"#conditional-view-processing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>HTTP クライアントは、さまざまな HTTPヘッダーを送信することで、受信したリソースについてサーバーに伝えることができます。この方法は、ウェブページを (<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> メソッドを利用して) 取得する際に、すでにクライアントが取得しているデータを送信するのを回避するためによく使われます。しかし、同じヘッダーは、全ての HTTP メソッド (<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> など) で利用できます。</p>\n<p>Django がビューから送り返す各ページ (レスポンス) に対して、Django は2種類の HTTP ヘッダ、<code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> ヘッダと <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> ヘッダを提供できます。これらのヘッダは HTTP レスポンス上ではオプションです。ヘッダはビュー関数で設定することも、<a class=\"reference internal\" href=\"/ja/6.1/ref/middleware/#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> ミドルウェアを使用して <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> ヘッダを設定してもらうこともできます。</p>\n<p>When the client next requests the same resource, it might send along a header\nsuch as either <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-13.1.3\"><strong>If-Modified-Since</strong></a> or\n<span class=\"target\" id=\"index-1\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-13.1.4\"><strong>If-Unmodified-Since</strong></a>, containing the date of the\nlast modification time it was sent, or either <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-13.1.1\"><strong>If-Match</strong></a> or <span class=\"target\" id=\"index-3\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-13.1.2\"><strong>If-None-Match</strong></a>,\ncontaining the last <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> it was sent. If the current version of the page\nmatches the <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the client, or if the resource has not been\nmodified, a 304 status code can be sent back, instead of a full response,\ntelling the client that nothing has changed. Depending on the header, if the\npage has been modified or does not match the <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the client, a 412\nstatus code (Precondition Failed) may be returned.</p>\n<p>より細かい粒度のコントロールが必要な場合には、ビューごとの条件付き処理関数を使えます。</p>\n<section id=\"the-condition-decorator\">\n<span id=\"conditional-decorators\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> デコレータ<a class=\"heading-anchor\" href=\"#the-condition-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>時には（実際にはかなり頻繁に）、リソースの <span class=\"target\" id=\"index-12\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-8.8.3\"><strong>ETag</strong></a> 値や最終更新時間を迅速に計算する関数も作成できます。これは、完全なビューを構築するために必要なすべての計算を行う <strong>必要がない</strong> 場合です。Django は、これらの関数を使用して、ビュー処理の「早期脱出」オプションを提供できます。たとえば、クライアントに対して、コンテンツが前回のリクエスト以降変更されていないことを伝えます。</p>\n<p>これら 2 つの関数は <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.condition</span></code> デコレータのパラメータとして渡されます。このデコレータは、HTTP リクエストのヘッダがリソースのヘッダと一致するかどうかを調べるために、2 つの関数 (両方の量を簡単かつ迅速に計算できない場合は、1 つだけを渡す必要があります) を使用します。もし一致しなければ、リソースの新しいコピーを計算して通常のビューを呼び出します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">condition</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=\"n\">condition</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">last_modified_func</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>ETag と最終更新時間を計算するための2つの関数は、受信した <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> オブジェクトと、それらがサポートするビュー関数と同じパラメータを、同じ順序で渡されます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified_func</span></code> に渡された関数は、リソースが最後に変更された時間を指定する標準の datetime 値を返すべきです。または、リソースが存在しない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を返すべきです。 <code class=\"docutils literal notranslate\"><span class=\"pre\">etag</span></code> デコレータに渡された関数は、リソースの <span class=\"target\" id=\"index-13\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-8.8.3\"><strong>ETag</strong></a> を表す文字列を返すべきです。または、それが存在しない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を返すべきです。</p>\n<p>デコレータは、それらがビューによってまだ設定されていない場合、そしてリクエストのメソッドが安全なもの（<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</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> ヘッダを設定します。</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=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Blog</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Entry</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">blog</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">published</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateTimeField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>最新のブログエントリーを表示するフロントページが、新しいブログエントリーを追加したときだけ変更されるのであれば、最終更新時刻をとても速く計算できます。そのブログに関連するすべてのエントリーの最新の <code class=\"docutils literal notranslate\"><span class=\"pre\">published</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\">latest_entry</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog_id</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;published&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">published</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">condition</span>\n\n\n<span class=\"nd\">@condition</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"o\">=</span><span class=\"n\">latest_entry</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<aside class=\"admonition-be-careful-with-the-order-of-decorators admonition\">\n<p class=\"admonition-title\">デコレータの順番に注意</p>\n<p>条件付きレスポンスが <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code> によって返される場合、それ以下のデコレータはスキップされ、レスポンスに適用されません。したがって、通常のビューレスポンスと条件付きレスポンスの両方に適用する必要があるデコレータは <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code> より上に置く必要があります。特に、 <a class=\"reference internal\" href=\"/ja/6.1/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie\" title=\"django.views.decorators.vary.vary_on_cookie\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">vary_on_cookie()</span></code></a>, <a class=\"reference internal\" href=\"/ja/6.1/topics/http/decorators/#django.views.decorators.vary.vary_on_headers\" title=\"django.views.decorators.vary.vary_on_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">vary_on_headers()</span></code></a>, <a class=\"reference internal\" href=\"/ja/6.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> は、 <span class=\"target\" id=\"index-14\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-15.4.5\"><strong>RFC 9110</strong></a> が 304 レスポンスにヘッダを設定することを要求しているため、最初に置くべきです。</p>\n</aside>\n</section>\n<section id=\"shortcuts-for-only-computing-one-value\">\n<h2>1つの値を計算するだけのショートカット<a class=\"heading-anchor\" href=\"#shortcuts-for-only-computing-one-value\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>一般的なルールとして、ETag と最終更新時刻の <em>両方</em> を計算する関数を提供できるのであれば、そうすべきです。どの HTTP クライアントがどのヘッダを送ってくるかはわからないので、両方を扱えるように準備しましょう。しかし、片方の値だけを計算するのが簡単な場合もあり、 Django は ETag だけ、あるいは last-modified だけを計算するデコレータを提供します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.etag</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.last_modified</span></code> デコレータは <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</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=\"n\">etag</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"p\">)</span>\n<span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>last-modified 関数だけを使う先ほどの例も、このデコレータを使って書くことができます。</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=\"nd\">@last_modified</span><span class=\"p\">(</span><span class=\"n\">latest_entry</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span> <span class=\"o\">...</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\">def</span><span class=\"w\"> </span><span class=\"nf\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"n\">front_page</span> <span class=\"o\">=</span> <span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"n\">latest_entry</span><span class=\"p\">)(</span><span class=\"n\">front_page</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"use-condition-when-testing-both-conditions\">\n<h3>2つの条件をテストする場合に <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> を使う<a class=\"heading-anchor\" href=\"#use-condition-when-testing-both-conditions\"><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\">etag</span></code> デコレータと <code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified</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=\"c1\"># Bad code. Don&#39;t do this!</span>\n<span class=\"nd\">@etag</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"p\">)</span>\n<span class=\"nd\">@last_modified</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"c1\"># End of bad code.</span>\n</code></pre></div>\n<p>最初のデコレータは 2 番目のデコレータについて何も知らないので、 2 番目のデコレータがレスポンスは変更されていると判断した場合でも、変更されていないと答えるかもしれません。条件 <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> デコレータは両方のコールバック関数を同時に使用して、正しい動作を決定します。</p>\n</section>\n</section>\n<section id=\"using-the-decorators-with-other-http-methods\">\n<h2>その他の HTTP メソッドでデコレータを使用する<a class=\"heading-anchor\" href=\"#using-the-decorators-with-other-http-methods\"><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\">condition</span></code> デコレータは <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> リクエスト以外にも有用です (<code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> リクエストはこの状況では <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> と同じです)。 <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> リクエストのチェックにも使うことができます。このような状況では、&quot;not modified&quot; 応答を返すのではなく、変更しようとしているリソースがその間に変更されたことをクライアントに伝えることを考えます。</p>\n<p>たとえば、つぎのようなクライアントとサーバを交換する例を考えてみてください。</p>\n<ol class=\"arabic simple\">\n<li><p>クライアントが <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code> をリクエストします。</p></li>\n<li><p>サーバーは何らかのコンテンツを <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;abcd1234&quot;</span></code> という ETag を付けて返します。</p></li>\n<li><p>クライアントは HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> リクエストを <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code> に送信して、リソースを更新します。<code class=\"docutils literal notranslate\"><span class=\"pre\">If-Match:</span> <span class=\"pre\">&quot;abcd1234&quot;</span></code> ヘッダも送信して、更新しようとしているバージョンを指定します。</p></li>\n<li><p>サーバーは、<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> リクエストと同じ方法で (同じ関数を使って) ETag を計算することで、リソースが変更されているかどうかをチェックします。もしリソースが <em>すでに</em> 変更されていた場合、「precondition failed」を意味するステータスコード412を返します。</p></li>\n<li><p>クライアントは、412レスポンスを受信した後、実際に更新する前に、更新されたバージョンのコンテンツを取得するために、<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> リクエストを <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code> に送信します。</p></li>\n</ol>\n<p>この例が示している重要な点は、ETag と最終変更の値を計算するのに、すべての状況で同じ関数が使えるということです。実際、毎回同じ値が返されるように、同じ関数を使う <strong>必要がある</strong> のです。</p>\n<aside class=\"admonition-validator-headers-with-non-safe-request-methods admonition\">\n<p class=\"admonition-title\">安全ではないリクエストメソッドを含むバリデーターヘッダ</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> デコレータは、安全な HTTP メソッド、つまり <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</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\">PUT</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> のリクエストに対するバリデーションヘッダの設定の違いについては <span class=\"target\" id=\"index-15\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.3.4\"><strong>RFC 9110 Section 9.3.4</strong></a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"comparison-with-middleware-conditional-processing\">\n<h2>ミドルウェアの条件付き処理との比較<a class=\"heading-anchor\" href=\"#comparison-with-middleware-conditional-processing\"><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/6.1/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.http.ConditionalGetMiddleware</span></code></a> 経由で条件付き <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> 処理を提供しています。多くの状況に適していますが、ミドルウェアは高度な利用に次のような限界があります。</p>\n<ul class=\"simple\">\n<li><p>プロジェクト内のすべてのビューにグローバルに適用されてしまう。</p></li>\n<li><p>レスポンスを生成する手間が省けるわけではなく、コストがかかる場合がある。</p></li>\n<li><p>HTTP の <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> リクエストに対してのみ適している。</p></li>\n</ul>\n<p>ここでは、特定の問題に最も適したツールを選択するべきです。もし ETag と変更時刻を高速に計算する手段があり、一部のビューがコンテンツを生成するのに時間がかかるのであれば、このドキュメントで説明した <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> デコレータを使用することを検討するべきです。もしすべてがすでにかなり高速に動作しているなら、引き続きミドルウェアを使用し続けてください。ビューが変更されていなければ、クライアントに送り返されるネットワークトラフィックは、引き続き削減されます。</p>\n</section>","rootId":"conditional-view-processing","toc":[{"title":"condition デコレータ","anchor":"the-condition-decorator","children":[]},{"title":"1つの値を計算するだけのショートカット","anchor":"shortcuts-for-only-computing-one-value","children":[{"title":"2つの条件をテストする場合に condition を使う","anchor":"use-condition-when-testing-both-conditions","children":[]}]},{"title":"その他の HTTP メソッドでデコレータを使用する","anchor":"using-the-decorators-with-other-http-methods","children":[]},{"title":"ミドルウェアの条件付き処理との比較","anchor":"comparison-with-middleware-conditional-processing","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.1/topics/"}],"prev":{"docname":"topics/cache","title":"Django のキャッシュフレームワーク","url":"/ja/6.1/topics/cache/"},"next":{"docname":"topics/composite-primary-key","title":"複合主キー","url":"/ja/6.1/topics/composite-primary-key/"},"formats":{"html":"/ja/6.1/topics/conditional-view-processing/","markdown":"/ja/6.1/topics/conditional-view-processing.md","json":"/ja/6.1/topics/conditional-view-processing.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/conditional-view-processing.txt","official":"https://docs.djangoproject.com/ja/6.1/topics/conditional-view-processing/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}