{"title":"Django のキャッシュフレームワーク","version":"5.0","locale":"ja","docname":"topics/cache","url":"/ja/5.0/topics/cache/","canonical":"https://djangodocs.dev/ja/5.0/topics/cache/","summary":"動的なウェブサイトの基本的なトレードオフは、ええと、それが動的であるということです。ユーザーがページをリクエストするたびに、ウェブサーバーはあらゆる種類の計算を行い…","html":"<h1>Django のキャッシュフレームワーク<a class=\"heading-anchor\" href=\"#django-s-cache-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>動的なウェブサイトの基本的なトレードオフは、ええと、それが動的であるということです。ユーザーがページをリクエストするたびに、ウェブサーバーはあらゆる種類の計算を行い (データベースのクエリから、テンプレートのレンダリングやビジネスロジックの実行まで)、サイトの訪問者が目にするページを作成します。これは、処理オーバーヘッドの観点から、ファイルシステムからファイルを読み取る標準的なサーバー構成よりもはるかに高コストです。</p>\n<p>ほとんどの Web アプリケーションでは、このオーバーヘッドは大した問題ではありません。ほとんどの Web アプリケーションは <code class=\"docutils literal notranslate\"><span class=\"pre\">washingtonpost.com</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">slashdot.org</span></code> ではなく、そこそこのトラフィックがある小規模から中規模のサイトです。ただし、中トラフィックから高トラフィックのサイトでは、オーバーヘッドをできる限り削減することが不可欠です。</p>\n<p>そこで登場するのがキャッシュです。</p>\n<p>何かをキャッシュすることは、次回に計算を実行する必要がないように、高価な計算の結果を保存することです。以下に示すのは、動的に生成された Web ページでキャッシュがどのように機能するかを説明する疑似コードです。</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>given a URL, try finding that page in the cache\nif the page is in the cache:\n    return the cached page\nelse:\n    generate the page\n    save the generated page in the cache (for next time)\n    return the generated page\n</code></pre></div>\n<p>Django には、動的ページを保存できるロバストなキャッシュ システムが付属しているため、各リクエストごとに動的ページを計算する必要はありません。便宜上、Django は異なるレベルのキャッシュ粒度を提供しています。特定のビューの出力をキャッシュしたり、生成が難しい部分のみをキャッシュしたり、サイト全体をキャッシュできます。</p>\n<p>Django は、 <a class=\"reference external\" href=\"http://www.squid-cache.org/\">Squid</a> やブラウザベースのキャッシュなどの「ダウンストリーム」キャッシュでもうまく機能します。これらは、直接コントロールできないタイプのキャッシュですが、サイトのどの部分をどのようにキャッシュする必要があるかというヒントを (HTTP ヘッダー経由で) 提供できます。</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/misc/design-philosophies/#cache-design-philosophy\"><span class=\"std std-ref\">キャッシュフレームワークの設計思想</span></a> では、フレームワークの設計上の決定のいくつかについて説明します。</p>\n</aside>\n<section id=\"setting-up-the-cache\">\n<span id=\"id1\"></span><h2>キャッシュのセットアップ<a class=\"heading-anchor\" href=\"#setting-up-the-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>キャッシュシステムにはちょっとした設定が必要です。つまり、キャッシュされたデータをどこに置くか、データベースか、ファイルシステムか、メモリに直接置くかを指定しなければなりません。これはキャッシュのパフォーマンスに影響する重要な決定です。</p>\n<p>キャッシュの設定は設定ファイルの <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定にあります。ここでは、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> で使用可能なすべての値について説明します。</p>\n<section id=\"memcached\">\n<span id=\"id2\"></span><h3>Memcached<a class=\"heading-anchor\" href=\"#memcached\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://memcached.org/\">Memcached</a> は完全にメモリベースのキャッシュ・サーバで、元々はLiveJournal.comの高負荷を処理するために開発され、その後Danga Interactiveによってオープンソース化されました。FacebookやWikipediaなどのサイトで使用され、データベースへのアクセスを減らし、サイトのパフォーマンスを劇的に向上させます。</p>\n<p>Memcached はデーモンとして動作し、指定された量の RAM が割り当てられます。キャッシュにデータを追加、取得、削除するための高速なインターフェイスを提供するだけです。すべてのデータはメモリに直接保存されるので、データベースやファイルシステムの使用によるオーバーヘッドはありません。</p>\n<p>Memcached 自体をインストールした後、Memcached バインディングをインストールする 必要があります。Python の Memcached バインディングはいくつかありますが、 Django がサポートしているのは <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pylibmc/\">pylibmc</a> と <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pymemcache/\">pymemcache</a> です。</p>\n<p>Django で Memcached を使用する</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyMemcacheCache</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyLibMCCache</span></code> (選択した memcached バインディングによる) に設定する</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">ip:port</span></code> の値 (ここで、<code class=\"docutils literal notranslate\"><span class=\"pre\">ip</span></code> は Memcached デーモンの IP アドレス、<code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code> は Memcached が起動しているポート)、または、<code class=\"docutils literal notranslate\"><span class=\"pre\">unix:path</span></code> の値に設定する (ここで、<code class=\"docutils literal notranslate\"><span class=\"pre\">path</span></code> は Memcached Unix socket ファイルへのパス)。</p></li>\n</ul>\n<p>次の例では、Memcached は localhost (127.0.0.1) port 11211 で起動していて、<code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>次の例では、Memcached はローカルの Unix socket ファイル <code class=\"file docutils literal notranslate\"><span class=\"pre\">/tmp/memcached.sock</span></code> 経由で利用可能であり、<code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;unix:/tmp/memcached.sock&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Memcached の優れた機能の一つは、複数のサーバでキャッシュを共有できることです。つまり、複数のマシンで Memcached デーモンを実行することができ、各マシンでキャッシュの値を重複させることなく、 <em>単一の</em> キャッシュとして扱うことができます。この機能を利用するには、全てのサーバのアドレスを <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> に、セミコロンまたはカンマ区切りの文字列、あるいはリストとして記述します。</p>\n<p>このインスタンスでは、IP アドレス 172.19.26.240 と 172.19.26.242 で動作する Memcached インスタンスをポート 11211 で共有します:</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;172.19.26.240:11211&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.242:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>以下の例では、172.19.26.240 (port 11211)、172.19.26.242 (port 11212)、172.19.26.244 (port 11213) の IP アドレスで動作する Memcached インスタンスでキャッシュを共有しています:</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;172.19.26.240:11211&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.242:11212&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.244:11213&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>デフォルトでは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">PyMemcacheCache</span></code> バックエンドは以下のオプションを設定します( <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;allow_unicode_keys&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;default_noreply&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;serde&quot;</span><span class=\"p\">:</span> <span class=\"n\">pymemcache</span><span class=\"o\">.</span><span class=\"n\">serde</span><span class=\"o\">.</span><span class=\"n\">pickle_serde</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Memcachedについての最後のポイントは、メモリベースのキャッシュには欠点があるということです。キャッシュされたデータはメモリに保存されるので、サーバーがクラッシュするとデータは失われます。メモリは永続的なデータ保存用ではないので、メモリベースのキャッシュを唯一のデータ保存用として使わないようにしましょう。明らかに、 Django のキャッシュバックエンドはどれも、永続的な保存には使うべきではありません。これらは全てキャッシュのためのソリューションであって、ストレージではありません。しかし、メモリベースのキャッシュは特に一時的なものであるため、 ここでに記載しておきます。</p>\n</section>\n<section id=\"redis\">\n<span id=\"id4\"></span><h3>Redis<a class=\"heading-anchor\" href=\"#redis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://redis.io/\">Redis</a> は、キャッシュに利用できるインメモリ データベースです。はじめに、Redis サーバーがローカルまたはリモートマシン上で起動している必要があります。</p>\n<p>Redis サーバを設定した後、Redis の Python バインディングをインストールする必要があります。 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/redis/\">redis-py</a> は Django によってネイティブにサポートされているバインディングです。 <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/hiredis/\">hiredis-py</a> パッケージも推奨のひとつです。</p>\n<p>Redis をキャッシュ バックエンドとして Django で使用するには、次のようにします。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.redis.RedisCache</span></code> に設定する。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> を、適切なスキーマを使用して Redis インスタンスを指す URL に設定する。<a class=\"reference external\" href=\"https://redis-py.readthedocs.io/en/stable/connections.html#redis.connection.ConnectionPool.from_url\">利用可能なスキーマの詳細</a> については、<code class=\"docutils literal notranslate\"><span class=\"pre\">redis-py</span></code> のドキュメントを参照してください。</p></li>\n</ul>\n<p>たとえば、Redis が localhost (127.0.0.1) port 6379 で起動している場合は、次のように設定します。</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Redis サーバーは認証で保護されていることがよくあります。ユーザー名とパスワードを提供するには、<code class=\"docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code> 内に URL とともに追加します。</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://username:password@127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>レプリケーション・モードで複数のRedisサーバーを設定している場合は、セミコロンまたはカンマ区切りの文字列、あるいはリストとしてサーバーを指定できます。複数のサーバーを使用している場合、書き込み操作は最初のサーバー（リーダー）で実行されます。読み取り操作は、ランダムに選ばれた他のサーバ（レプリカ）で実行されます:</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># leader</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6378&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># read-replica 1</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6377&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># read-replica 2</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"database-caching\">\n<span id=\"id6\"></span><h3>データベースのキャッシュ<a class=\"heading-anchor\" href=\"#database-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django はキャッシュデータをデータベース中に保存できます。この仕組みは、高速で適切にインデックス付けされたデータベースサーバーがある場合に、有効に機能します。</p>\n<p>データベースのテーブルをキャッシュのバックエンドに使用する場合には、以下のように設定します。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.db.DatabaseCache</span></code> に設定する</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">tablename</span></code> にデータベーステーブルの名前を設定します。この名前は、データベースで未使用かつ有効な名前であれば、自分が好きな名前で構いません。</p></li>\n</ul>\n<p>この例では、キャッシュテーブルの名前を <code class=\"docutils literal notranslate\"><span class=\"pre\">my_cache_table</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.db.DatabaseCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_cache_table&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>他のキャッシュバックエンドとは異なり、データベースキャッシュはデータベースレベルでの期限切れエントリの自動間引き (culling) をサポートしていません。その代わり、 <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> が呼び出されるたびに、期限切れのキャッシュエントリが「間引き」されます。</p>\n<section id=\"creating-the-cache-table\">\n<h4>キャッシュテーブルを作成する<a class=\"heading-anchor\" href=\"#creating-the-cache-table\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>データベース キャッシュを使用する前に、次のコマンドでキャッシュテーブルを必ず作成する必要があります。</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</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=\"Shell code\"><code>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>createcachetable\n</code></pre></div>\n<p>このコマンドにより、データベース内に1つのテーブルが作成され、Django のデータベースキャッシュシステムに必要な適切なフォーマットが生成されます。テーブルの名前は <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> が使用されます。</p>\n<p>複数のデータベースキャッシュが使用される場合、<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> は1つのキャッシュごとに、対応する1つのテーブルを作成します。</p>\n<p>複数のデータベースを使用する場合、<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> は、データベースのルートの <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> メソッド (以下を参照) を監視します。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> と同様に、<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> は既に存在する既存のテーブルにたいしては手を触れません。存在しないテーブルのみを生成します。</p>\n<p>実行される予定の SQL を実行せずに表示するためには、<a class=\"reference internal\" href=\"/ja/5.0/ref/django-admin/#cmdoption-createcachetable-dry-run\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">createcachetable</span> <span class=\"pre\">--dry-run</span></code></a> オプションを使用します。</p>\n</section>\n<section id=\"multiple-databases\">\n<h4>複数のデータベース<a class=\"heading-anchor\" href=\"#multiple-databases\"><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\">django_cache</span></code> という名前のアプリケーションに <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheEntry</span></code> という名前のモデルとして表示されます。このモデルはモデルキャッシュには表示されませんが、ルーティングの目的でモデルの詳細情報を使用できます。</p>\n<p>たとえば、以下のルーターはすべてのキャッシュの読み込み操作を <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_replica</span></code> に転送し、すべての書き込み操作を <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code> に転送します。キャッシュテーブルは <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</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\">class</span><span class=\"w\"> </span><span class=\"nc\">CacheRouter</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;A router to control all database cache operations&quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;All cache read operations go to the replica&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;cache_replica&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;All cache write operations go to primary&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;cache_primary&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">model_name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Only install the cache model on primary&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">db</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;cache_primary&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>データベースキャッシュモデルに対してルーティングの方向を指定しなかった場合、キャッシュバックエンドは <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> データベースを使用します。</p>\n<p>そして、データベースキャッシュバックエンドを使用しなかった場合には、データベースキャッシュモデルに対してデータベースルーティングの指示を提供することについて心配する必要はありません。</p>\n</section>\n</section>\n<section id=\"filesystem-caching\">\n<h3>ファイルシステムのキャッシュ<a class=\"heading-anchor\" href=\"#filesystem-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ファイルベースのバックエンドは、各キャッシュの値を独立したファイルとしてシリアライズして保存します。このバックエンドを使用するには、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span></code> に設定して、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> を適切なディレクトリに設定します。たとえば、キャッシュデータを <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/var/tmp/django_cache&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Windows では、次のようにドライブ文字をパスの最初に付けてください。</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;c:/foo/bar&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>ディレクトリのパスは絶対パスである必要があります。つまり、ファイルシステムのルートから始まる必要があります。設定の最後にスラッシュを置くかどうかは関係ありません。</p>\n<p>この設定が指すディレクトリは、存在して読み込みと書き込みが可能であるか、または、ウェブサーバーを実行しているシステムユーザーによって作成可能であることを確認してください。上の例を続けると、もしサーバーが <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code> ユーザーで実行されているなら、<code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code> が存在して <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code> ユーザーにより読み書き可能であるか、このディレクトリを <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code> ユーザーが作成できることを確認してください。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>キャッシュの <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> が、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a>、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_ROOT</span></code></a>、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATICFILES_FINDERS</span></code></a> のいずれかの配下に含まれていると、機密データが漏洩してしまう可能性があります。</p>\n<p>キャッシュファイルへのアクセスを獲得した攻撃者は、HTML コンテンツを改竄できるだけでなく、データが <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a> を使用してシリアライズされているため、任意のコードのリモート実行までできてしまいます。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>ファイルシステムキャッシュは、大量のファイルを保存すると低速になってしまう可能性があります。この問題に遭遇したときは、別のキャッシュメカニズムの使用を検討してください。<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.0.x/django/core/cache/backends/filebased.py\">FileBasedCache</a> をサブクラス化して、淘汰戦略を改善することもできます。</p>\n</aside>\n</section>\n<section id=\"local-memory-caching\">\n<span id=\"id7\"></span><h3>ローカルメモリのキャッシュ<a class=\"heading-anchor\" href=\"#local-memory-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>設定ファイルに他のキャッシュが指定されていない場合、これがデフォルトのキャッシュとなります。インメモリキャッシュの速度の利点が欲しいが、Memcached を扱うのが難しい場合は、 ローカルメモリキャッシュバックエンドを検討してください。このキャッシュはプロセス単位 (後述) で、スレッドセーフです。これを使うには、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;unique-snowflake&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>キャッシュの <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> は個々のメモリストアを識別するために使用されます。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code> キャッシュが1つしかない場合は <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> を省略できます。しかし、複数のローカルメモリーキャッシュがある場合は、それらを区別するために少なくとも1つに名前を割り当てる必要があります。</p>\n<p>キャッシュは LRU (least-recently-used) 淘汰戦略 (culling strategy) を使用します。</p>\n<p>各プロセスはそれ自身のプライベートキャッシュインスタンスを持つことに注意してください。このことは、ローカル・メモリ・キャッシュが特にメモリ効率に優れているわけではないことを意味します。そのため、おそらく本番環境には良い選択ではありません。開発環境には適しています。</p>\n</section>\n<section id=\"dummy-caching-for-development\">\n<h3>ダミーキャッシュ（開発用）<a class=\"heading-anchor\" href=\"#dummy-caching-for-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>最後に、 Django には実際にはキャッシュしない「ダミー」キャッシュが付属しています。何もせずにキャッシュインターフェースを実装しているだけです。</p>\n<p>これは、様々な場所で重量級のキャッシュを使用する本番サイトと、開発/テスト用に、キャッシュを行わず、コード変更も最小限に留めたい環境がある場合に便利です。ダミーキャッシュをアクティブにするには、<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.dummy.DummyCache&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-cache-backend\">\n<h3>独自のキャッシュバックエンドを使う<a class=\"heading-anchor\" href=\"#using-a-custom-cache-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django は「箱から出してすぐに」多くのキャッシュバックエンドをサポートしていますが、カスタマイズ したキャッシュバックエンドを使いたいこともあるでしょう。Django で外部のキャッシュバックエンドを使用するには、下記のように、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定の <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> に Python のインポートパスを使用します:</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;path.to.backend&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>独自のバックエンドを構築する場合は、標準のキャッシュバックエンドをリファレンス実装として使うことができます。コードは Django ソースの <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.0.x/django/core/cache/backends/\">django/core/cache/backends/</a> ディレクトリにあります。</p>\n<p>注記：ホストがサポートしていないなど、やむを得ない理由がない限り、Django に付属しているキャッシュバックエンドを使用するべきです。それらは十分にテストされており、よくドキュメント化されています。</p>\n</section>\n<section id=\"cache-arguments\">\n<span id=\"id8\"></span><h3>キャッシュ引数<a class=\"heading-anchor\" href=\"#cache-arguments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>それぞれのキャッシュバックエンドはキャッシュの動作を制御するために追加の引数を指定できます。これらの引数は <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定の追加キーとして提供されます。有効な引数は以下の通りです:</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code></a>: キャッシュに使用するデフォルトのタイムアウトを秒単位で指定します。この引数のデフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code> 秒（5分）です。 <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を指定することで、デフォルトではキャッシュキーの有効期限が切れません。値を <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> にすると、キーはすぐに期限切れになります（事実上 &quot;キャッシュしない&quot;）。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>: キャッシュバックエンドに渡すオプション。有効なオプションのリストはバックエンドによって異なり、サードパーティライブラリにバックされたキャッシュバックエンドはそのオプションを直接キャッシュライブラリに渡します。</p>\n<p>独自の淘汰戦略 (culling strategy) を実装しているキャッシュバックエンド (<code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">filesystem</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code> バックエンド) では、以下のオプションが有効です:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code>: 古い値が削除されるまでにキャッシュに保存できる最大エントリ数。この引数のデフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code> です。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> に達したときに間引き (cull) されるエントリの割合。実際の割合は <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span> <span class=\"pre\">/</span> <span class=\"pre\">CULL_FREQUENCY</span></code> なので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> に設定すると、 <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> に達したときにエントリの半分をカリングします。この引数は整数で、デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">3</span></code> です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> という値を指定すると、 <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> に達したときにキャッシュ全体がダンプされます。一部のバックエンド (特に <code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code>) では、キャッシュミスが増える代わりにカリング（間引き）が非常に速くなります。</p>\n</li>\n</ul>\n<p>Memcached と Redis のバックエンドは、クライアントの動作をより高度に制御できるように、クライアントのコンストラクタにキーワード引数として <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> の内容を渡します。使用例は以下を参照してください。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>: Django サーバが使用する全てのキャッシュキーに自動的に含まれる文字列です（デフォルトでは先頭に付加されます）。</p>\n<p>詳細は <a class=\"reference internal\" href=\"#cache-key-prefixing\"><span class=\"std std-ref\">キャッシュのドキュメント</span></a> を参照してください。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>: Django サーバが生成するキャッシュキーのデフォルトのバージョン番号。</p>\n<p>詳細は <a class=\"reference internal\" href=\"#cache-versioning\"><span class=\"std std-ref\">キャッシュのドキュメント</span></a> を参照してください。</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a> プレフィックス、バージョン、およびキーを最終的なキャッシュ・キーに合成する方法を定義する関数へのドット区切りパスを含む文字列。</p>\n<p>詳細は <a class=\"reference internal\" href=\"#cache-key-transformation\"><span class=\"std std-ref\">キャッシュのドキュメント</span></a> を参照してください。</p>\n</li>\n</ul>\n<p>この例では、ファイルシステム・バックエンドをタイムアウト60秒、最大容量1000アイテムで設定しています。</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/var/tmp/django_cache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;TIMEOUT&quot;</span><span class=\"p\">:</span> <span class=\"mi\">60</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;MAX_ENTRIES&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1000</span><span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>以下は、<code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> ベースのバックエンドをバイナリプロトコル、SASL認証、および <code class=\"docutils literal notranslate\"><span class=\"pre\">ketama</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyLibMCCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;binary&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;username&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;user&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;password&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pass&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;behaviors&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;ketama&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>以下は <code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</span></code> ベースのバックエンドの設定例です。クライアントのプーリングを有効にし (クライアントの接続を維持することでパフォーマンスを向上させることができます)、memcache/ネットワークのエラーをキャッシュミスとして扱い、接続ソケットに <code class=\"docutils literal notranslate\"><span class=\"pre\">TCP_NODELAY</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;no_delay&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;ignore_exc&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;max_pool_size&quot;</span><span class=\"p\">:</span> <span class=\"mi\">4</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;use_pooling&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>以下は、<code class=\"docutils literal notranslate\"><span class=\"pre\">redis</span></code> ベースのバックエンドの設定例です。データベースに <code class=\"docutils literal notranslate\"><span class=\"pre\">10</span></code> を選択し (デフォルトではRedisには16の論理データベースがあります) 、 <a class=\"reference external\" href=\"https://github.com/redis/redis-py#parsers\">parser class</a> を指定し (<code class=\"docutils literal notranslate\"><span class=\"pre\">hiredis-py</span></code> パッケージがインストールされている場合、デフォルトで <code class=\"docutils literal notranslate\"><span class=\"pre\">redis.connection.HiredisParser</span></code> が使用されます)、およびカスタムの <a class=\"reference external\" href=\"https://github.com/redis/redis-py#connection-pools\">connection pool class</a> を設定しています (デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">redis.ConnectionPool</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\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;db&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;10&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;parser_class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis.connection.PythonParser&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;pool_class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis.BlockingConnectionPool&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-per-site-cache\">\n<span id=\"id9\"></span><h2>サイトごとのキャッシュ<a class=\"heading-anchor\" href=\"#the-per-site-cache\"><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\">'django.middleware.cache.UpdateCacheMiddleware'</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.FetchFromCacheMiddleware'</span></code> を <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</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;django.middleware.cache.UpdateCacheMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.common.CommonMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.cache.FetchFromCacheMiddleware&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>いいえ、これは typo ではありません。&quot;update&quot; ミドルウェアはリストの最初に、&quot;fetch&quot; ミドルウェアはリストの最後になければなりません。詳細は少し曖昧ですが、全容を知りたい方は下記の <a class=\"reference internal\" href=\"#order-of-middleware\">Order of MIDDLEWARE</a> を参照してください。</p>\n</aside>\n<p>次に、以下の必要な設定を Django 設定ファイルに追加します:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_ALIAS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_ALIAS</span></code></a> -- ストレージに使用するキャッシュのエイリアス。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/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> -- 各ページがキャッシュされるべき秒数を整数で指定します。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_KEY_PREFIX</span></code></a> -- キャッシュが同じ Django インストールを使っている複数のサイトで共有され ている場合、キーの衝突を防ぐために、サイトの名前か、この Django インスタンスに固有な文字列を指定します。気にしないなら空文字列を使いましょう。</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> はリクエストヘッダとレスポンスヘッダが許す限り、ステータス 200 の GET と HEAD レスポンスをキャッシュします。異なるクエリパラメータを持つ同じURLへのリクエストに対するレスポンスはユニークなページとみなされ、別々にキャッシュされます。このミドルウェアは、HEADリクエストが、対応するGETリクエストと同じレスポンスヘッダーで応答されることを期待します。その場合、HEADリクエストに対してキャッシュされたGETレスポンスを返すことができます。</p>\n<p>さらに、<code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> は <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">ダウンストリームキャッシュ</span></a> に影響を与えるいくつかのヘッダを <a class=\"reference internal\" href=\"/ja/5.0/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<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> ヘッダーに現在の日時と定義された <a class=\"reference internal\" href=\"/ja/5.0/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> をセットします。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> ヘッダにページの最大寿命をセットします -- ここでも <a class=\"reference internal\" href=\"/ja/5.0/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> 設定を使用します。</p></li>\n</ul>\n<p>ミドルウェアについては <a class=\"reference internal\" href=\"/ja/5.0/topics/http/middleware/\"><span class=\"doc\">ミドルウェア (Middleware)</span></a> を参照してください。</p>\n<p>ビューがキャッシュの有効期限を設定している場合 (つまり、ヘッダの <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> セクションがある場合) は、 <a class=\"reference internal\" href=\"/ja/5.0/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> ではなく、有効期限までページがキャッシュされます。<code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> のデコレータを使用すると、ビューの有効期限を簡単に設定 (<a class=\"reference internal\" href=\"/ja/5.0/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> デコレータを使用) したり、ビューのキャッシュを無効にしたり (<a class=\"reference internal\" href=\"/ja/5.0/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">never_cache()</span></code></a> デコレータを使用) することができます。これらのデコレータについての詳細は、 <a class=\"reference internal\" href=\"#controlling-cache-using-other-headers\">他のヘッダを使用する</a> セクションを参照してください。</p>\n<p id=\"i18n-cache-key\"><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定されている場合、生成されたキャッシュキーにアクティブな <a class=\"reference internal\" href=\"/ja/5.0/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">言語</span></a> の名前が含まれるようになります。 <a class=\"reference internal\" href=\"/ja/5.0/topics/i18n/translation/#how-django-discovers-language-preference\"><span class=\"std std-ref\">Django はどうやって言語の優先順位を検出するのか？</span></a> も参照してください。これにより、自分でキャッシュキーを作成する必要なく、複数言語のサイトを簡単にキャッシュできるようになります。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定されている場合、キャッシュキーには <a class=\"reference internal\" href=\"/ja/5.0/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">カレントタイムゾーン</span></a> も含まれます。</p>\n</section>\n<section id=\"the-per-view-cache\">\n<h2>ビューごとのキャッシュ<a class=\"heading-anchor\" href=\"#the-per-view-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.cache.cache_page\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.views.decorators.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cache_page</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">cache</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key_prefix</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.cache.cache_page\"><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.views.decorators.cache</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</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.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n\n\n<span class=\"nd\">@cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</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</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> はキャッシュのタイムアウトを秒数で指定する1つの引数を取ります。上の例では、<code class=\"docutils literal notranslate\"><span class=\"pre\">my_view()</span></code>  ビューの結果が15分間キャッシュされます。(ここでリーダビリティのために <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> と書いていることに注意してください。<code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">900</span></code> つまり15分×60秒と評価されます。)</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> で設定されたキャッシュのタイムアウトは、<code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> ヘッダの <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> ディレクティブよりも優先されます。</p>\n<p>サイトごとのキャッシュと同様に、ビューごとのキャッシュは URL でキーが区別されます。もし複数の URL が同じビューを指した場合、各 URL が別にキャッシュされます。<code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> の例を続けて、URLconf が次のようになっているとします。</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\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">my_view</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>このとき、<code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/1/</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code> へのリクエストは別々にキャッシュされます。しかし、特定の URL (たとえば、<code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code>) が一度リクエストされると、その URL への続くリクエストにはキャッシュが使われます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> はオプション引数の <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> を取ることもできます。これを使うと、ビューの結果をキャッシュするときに、デコレータに (<a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定から) 特定のキャッシュを使うように指示できます。デフォルトでは、<code class=\"docutils literal notranslate\"><span class=\"pre\">default</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=\"nd\">@cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">,</span> <span class=\"n\">cache</span><span class=\"o\">=</span><span class=\"s2\">&quot;special_cache&quot;</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</code></pre></div>\n<p>また、ビューごとにキャッシュプレフィックスを上書きすることもできます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> はオプションのキーワード引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> を取ります。これはミドルウェアの <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_KEY_PREFIX</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=\"nd\">@cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">,</span> <span class=\"n\">key_prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;site1&quot;</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</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> 引数と <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> 引数は同時に指定できます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> 引数と <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> で指定した <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> は連結されます。</p>\n<p>さらに、 <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> は自動的にレスポンスに <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> ヘッダを設定します。このヘッダは <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">ダウンストリームキャッシュ</span></a> に影響を与えます。</p>\n<section id=\"specifying-per-view-cache-in-the-urlconf\">\n<h3>ビューごとのキャッシュを URLconf で指定する<a class=\"heading-anchor\" href=\"#specifying-per-view-cache-in-the-urlconf\"><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\">cache_page</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> 関数を変更するため、ビューがキャッシュされることをハードコードしていました。この方法では、ビューをキャッシュシステムに結合することになり、いくつかの理由から理想的ではありません。例えば、キャッシュのない別のサイトでビュー関数を再利用したい場合や、キャッシュされずにビューを使いたい人にビューを配布したい場合などです。このような問題の解決策は、ビュー関数そのものではなく URLconf でビューごとのキャッシュを指定することです。</p>\n<p>URLconf でビュー関数を参照するときに <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> でラップすることで、これを実現できます。以下は以前の古い URLconf です。</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\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">my_view</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>以下は <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</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.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">)(</span><span class=\"n\">my_view</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"template-fragment-caching\">\n<span id=\"std-templatetag-cache\"></span><h2>テンプレートフラグメントのキャッシュ<a class=\"heading-anchor\" href=\"#template-fragment-caching\"><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\">cache</span></code> テンプレートタグを使ってテンプレートの断片をキャッシュすることもできます。テンプレートからこのタグにアクセスするには、テンプレートの先頭付近に <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> を記述します。</p>\n<p>テンプレートタグ <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> は指定した時間だけブロックの内容をキャッシュします。少なくとも2つの引数を取ります。秒単位のキャッシュタイムアウトと、キャッシュフラグメントに与える名前です。timeout が <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> の場合、フラグメントは永遠にキャッシュされます。名前はそのまま使用されるので、変数は使えません。次に例を示します。</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">cache</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">500</span> <span class=\"nv\">sidebar</span> <span class=\"cp\">%}</span>\n    .. sidebar ..\n<span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>フラグメントの内部に現れる動的なデータに応じて、フラグメントの複数のコピーをキャッシュしたい場合があります。たとえば、先ほどの例で使用したサイドバーを、サイトのすべてのユーザーに対して個別にキャッシュしたいとします。これを行うには、キャッシュフラグメントを一意に識別するために、フィルタの有無にかかわらず、1つ以上の追加の引数を <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> テンプレートタグに渡します。</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">cache</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">500</span> <span class=\"nv\">sidebar</span> <span class=\"nv\">request.user.username</span> <span class=\"cp\">%}</span>\n    .. sidebar for logged in user ..\n<span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定されている場合、サイトごとのミドルウェアキャッシュは <a class=\"reference internal\" href=\"#i18n-cache-key\"><span class=\"std std-ref\">アクティブな言語</span></a> を尊重します。テンプレートタグの <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> では <a class=\"reference internal\" href=\"/ja/5.0/topics/i18n/translation/#template-translation-vars\"><span class=\"std std-ref\">翻訳固有の変数</span></a> を使えば同じ結果が得られます:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">cache</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">600</span> <span class=\"nv\">welcome</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Welcome to example.com&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>テンプレート変数が整数値に解決されるなら、キャッシュタイムアウトにはテンプレート変数が使えます。例えば、テンプレート変数 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_timeout</span></code> が値 <code class=\"docutils literal notranslate\"><span class=\"pre\">600</span></code> に指定されている場合、以下の2つの例は等価です:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">600</span> <span class=\"nv\">sidebar</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"nv\">my_timeout</span> <span class=\"nv\">sidebar</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>この機能はテンプレート内での繰り返しを避けるのに便利です。1つの変数にタイムアウトを指定し、その値を再利用できます。</p>\n<p>デフォルトでは、キャッシュタグは &quot;template_fragments&quot; というキャッシュを使用しようとします。そのようなキャッシュが存在しない場合は、デフォルトのキャッシュを使用します。キーワード引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> で、使用する別のキャッシュバックエンドを選択できます。</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</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=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">300</span> <span class=\"nv\">local-thing</span> <span class=\"p\">...</span>  <span class=\"nv\">using</span><span class=\"o\">=</span><span class=\"s2\">&quot;localcache&quot;</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>設定されていないキャッシュ名を指定することはエラーとみなされます。</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.utils.make_template_fragment_key\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.utils.</span></span><span class=\"sig-name descname\"><span class=\"pre\">make_template_fragment_key</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fragment_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">vary_on</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.utils.make_template_fragment_key\"><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\">make_template_fragment_key</span></code> を使用します。フラグメント名 <code class=\"docutils literal notranslate\"><span class=\"pre\">fragment_name</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> テンプレートタグの2番目の引数と同じです。この関数は、キャッシュされたアイテムを無効にしたり上書きしたりする場合などに便利です:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">make_template_fragment_key</span>\n<span class=\"go\"># cache key for {% cache 500 sidebar username %}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">key</span> <span class=\"o\">=</span> <span class=\"n\">make_template_fragment_key</span><span class=\"p\">(</span><span class=\"s2\">&quot;sidebar&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">username</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"p\">)</span>  <span class=\"c1\"># invalidates cached template fragment</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"the-low-level-cache-api\">\n<span id=\"low-level-cache-api\"></span><h2>低レベルキャッシュ API<a class=\"heading-anchor\" href=\"#the-low-level-cache-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>レンダリングされたページ全体をキャッシュしてもあまりメリットがないこともありますし、実際、過剰なキャッシュはかえって不便です。</p>\n<p>たとえば、あなたのサイトには、結果が複数の高コストなクエリに依存し、その結果が異なる間隔で変化するビューが含まれているとします。この場合、サイト単位やビュー単位のキャッシュ戦略が提供するフルページキャッシュを使うのは理想的ではありません。なぜなら、結果全体をキャッシュしたいとは思わないでしょうが(データの一部が頻繁に変更されるからです)、めったに変更されない結果はキャッシュしたいからです。</p>\n<p>このような場合のために、 Django は低レベルのキャッシュ API を公開しています。この API を使えば、好きなレベルでオブジェクトをキャッシュに保存できます。 安全に pickle 化できる Python オブジェクトなら何でもキャッシュできます: 文字列、辞書、モデルオブジェクトのリストなど。(ほとんどの一般的なPythonオブジェクトはpickle化できます。pickle化についての詳細はPythonのドキュメントを参照してください)。</p>\n<section id=\"accessing-the-cache\">\n<h3>キャッシュへのアクセス<a class=\"heading-anchor\" href=\"#accessing-the-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.caches\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">caches</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.caches\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定で設定したキャッシュには、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.caches</span></code> という Dict のようなオブジェクトでアクセスできます。同じスレッドで同じエイリアスを繰り返しリクエストすると、同じオブジェクトが返されます。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">caches</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache1</span> <span class=\"o\">=</span> <span class=\"n\">caches</span><span class=\"p\">[</span><span class=\"s2\">&quot;myalias&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache2</span> <span class=\"o\">=</span> <span class=\"n\">caches</span><span class=\"p\">[</span><span class=\"s2\">&quot;myalias&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache1</span> <span class=\"ow\">is</span> <span class=\"n\">cache2</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>指定したキーが存在しない場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">InvalidCacheBackendError</span></code> が発生します。</p>\n<p>スレッドセーフを実現するために、キャッシュバックエンドの異なるインスタンスがスレッドごとに返されます。</p>\n</dd></dl>\n\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cache</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.cache\"><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\">django.core.cache.cache</span></code> で利用できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache</span>\n</code></pre></div>\n<p>このオブジェクトは <code class=\"docutils literal notranslate\"><span class=\"pre\">caches['default']</span></code> と等価です。</p>\n</dd></dl>\n\n</section>\n<section id=\"basic-usage\">\n<span id=\"cache-basic-interface\"></span><h3>基本的な使用法<a class=\"heading-anchor\" href=\"#basic-usage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>基本的なインターフェイスは、次のようになります。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.set\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">set</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hello, world!&quot;</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello, world!&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> には <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> を指定し、 <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> には任意の Python オブジェクトを指定します。</p>\n<p>引数の <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> はオプションで、デフォルトは <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定 (上記で説明) にある適切なバックエンドの <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> 引数です。これはキャッシュに保存される秒数です。 <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を渡すと、値は永遠にキャッシュされます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> に <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> を渡すと、値はキャッシュされません。</p>\n<p>オブジェクトがキャッシュに存在しない場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を返します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Wait 30 seconds for &#39;my_key&#39; to expire...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n</code></pre></div>\n<p>オブジェクトがキャッシュに存在するかどうかを判断する必要があり、リテラル値 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> を保存した場合は、デフォルトとして sentinel オブジェクトを使用します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sentinel</span> <span class=\"o\">=</span> <span class=\"nb\">object</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">sentinel</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"n\">sentinel</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Wait 30 seconds for &#39;my_key&#39; to expire...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">sentinel</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"n\">sentinel</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> 引数を取ることができます。これは、オブジェクトがキャッシュに存在しない場合に返す値を指定します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;has expired&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;has expired&#39;</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.add\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.add\"><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\">add()</span></code> メソッドを使用します。このメソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code> と同じパラメータを受け取りますが、指定したキーがすでに存在する場合はキャッシュを更新しようとしません:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Initial value&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;New value&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;Initial value&#39;</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> が値をキャッシュに保存したかどうかを知りたい場合は、戻り値をチェックできます。値が保存されていれば <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> を返し、そうでなければ <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返します。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get_or_set\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_or_set</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get_or_set\"><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\">get_or_set()</span></code> メソッドが使えます。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> と同じパラメータを受け取りますが、そのキーのデフォルトの戻り値が設定されます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_new_key&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># returns None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_or_set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_new_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my new value&quot;</span><span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;my new value&#39;</span>\n</code></pre></div>\n<p>また、任意の呼び出し可能オブジェクトを <em>デフォルト</em> 値として渡すこともできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_or_set</span><span class=\"p\">(</span><span class=\"s2\">&quot;some-timestamp-key&quot;</span><span class=\"p\">,</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=\"go\">datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keys</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get_many\"><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\">get_many()</span></code> インターフェースもあります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> は、キャッシュに実際に存在する (そして有効期限が切れていない) キーをすべて含む辞書を返します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;c&quot;</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">{&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.set_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">set_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">dict</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.set_many\"><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\">set_many()</span></code> を使用してキーと値のペアの辞書を渡します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set_many</span><span class=\"p\">({</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">:</span> <span class=\"mi\">3</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">{&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache.set()</span></code> と同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> はオプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> パラメータを受け取ります。</p>\n<p>サポートされているバックエンド (memcached) では、 <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> は挿入に失敗したキーのリストを返します。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.delete\"><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\">delete()</span></code> で明示的にキーを削除することで、特定のオブジェクトのキャッシュをクリアできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> はキーの削除に成功すると <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> を返し、失敗すると <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返します。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.delete_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keys</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.delete_many\"><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\">delete_many()</span></code> にクリアしたいキーのリストを渡します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.clear\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">clear</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.clear\"><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\">cache.clear()</span></code> を使用します。 <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> はアプリケーションによって設定されたキーだけでなく、 <em>すべての</em> キーをキャッシュから削除します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.touch\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">touch</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.touch\"><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\">cache.touch()</span></code> はキーの有効期限を設定します。例えば、キーの有効期限を10秒後に更新する場合:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">touch</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>他のメソッドと同様に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> 引数はオプションで、デフォルトは <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定の適切なバックエンドの <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> オプションです。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> はキーが正しく touch された場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> を返し、そうでない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> を返します。</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.incr\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">incr</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">delta</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.incr\"><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 method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.decr\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">decr</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">delta</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.decr\"><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\">incr()</span></code> メソッドまたは <code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code> メソッドを使用して、既に存在するキーをインクリメント/デクリメントすることもできます。デフォルトでは、既存のキャッシュの値が 1 だけインクリメント/デクリメントされます。インクリメント/デクリメントの呼び出しに引数を指定することで、1以外のインクリメント/デクリメント値を指定できます。存在しないキャッシュ・キーをインクリメントまたはデクリメントしようとすると、ValueError が発生します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"go\">12</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">decr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">11</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">decr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n<span class=\"go\">6</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\">incr()</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code> メソッドはアトミックであることは保証されていません。アトミックなインクリメント/デクリメントをサポートしているバックエンド (特に memcached バックエンド) では、インクリメントとデクリメントの操作はアトミックに行われます。しかし、バックエンドがネイティブにインクリメント/デクリメント操作を提供していない場合は、取得/更新の2段階を使って実装されます。</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.close\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">close</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.close\"><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\">close()</span></code> でキャッシュへの接続を閉じることができます。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">close</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\">close</span></code> メソッドを実装していないキャッシュでは、このメソッドは何もしません。</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>メソッドの非同期バージョンは、ベースとなるメソッドに <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code> で始まるプレフィックスが付けられています。例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.aadd()</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.adelete_many()</span></code> です。詳細については <a class=\"reference internal\" href=\"#id14\">Asynchronous support</a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"cache-key-prefixing\">\n<span id=\"id11\"></span><h3>キャッシュ キーにプレフィックスを付ける<a class=\"heading-anchor\" href=\"#cache-key-prefixing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>サーバ間でキャッシュインスタンスを共有している場合、あるいは本番環境と開発環境の間でキャッシュインスタンスを共有している場合、あるサーバでキャッシュされたデータが別のサーバで使用される可能性があります。キャッシュされたデータのフォーマットがサーバ間で異なる場合、非常に診断が難しい問題につながる可能性があります。</p>\n<p>これを防ぐために、 Django はサーバが使う全てのキャッシュキーの前にプレフィックスを付ける機能を提供します。特定のキャッシュキーが保存または取得されると、 Django は自動的に <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> キャッシュ設定の値をキャッシュキーの先頭に付加します。</p>\n<p>各 Django インスタンスに異なる <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> を持たせることで、キャッシュ値が衝突しないようにできます。</p>\n</section>\n<section id=\"cache-versioning\">\n<span id=\"id12\"></span><h3>キャッシュのバージョン管理<a class=\"heading-anchor\" href=\"#cache-versioning\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>キャッシュされた値を使用する実行中のコードを変更する場合、既存のキャッシュされた値を消去する必要があるかもしれません。これを行う最も簡単な方法はキャッシュ全体を削除することですが、まだ有効で有用なキャッシュ値を失うことになります。</p>\n<p>Django は個々のキャッシュ値をターゲットにする、より良い方法を提供します。Django のキャッシュフレームワークには、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a> キャッシュ設定で指定できる、システム全体のバージョン識別子があります。この設定の値は、自動的にキャッシュ・プレフィックスとユーザが指定したキャッシュ・キーと組み合わされ、最終的なキャッシュ・キーが得られます。</p>\n<p>デフォルトでは、どのようなキャッシュキーのリクエストも自動的にサイトのデフォルトのキャッシュキーのバージョンを含みます。しかし、基本的なキャッシュ関数には <code class=\"docutils literal notranslate\"><span class=\"pre\">version</span></code> 引数が含まれているので、特定のキャッシュキーのバージョンを指定できます。たとえば:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Set version 2 of a cache key</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hello world!&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the default version (assuming version=1)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get version 2 of the same key</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello world!&#39;</span>\n</code></pre></div>\n<p>特定のキーのバージョンは <code class=\"docutils literal notranslate\"><span class=\"pre\">incr_version()</span></code> メソッドと <code class=\"docutils literal notranslate\"><span class=\"pre\">decr_version()</span></code> メソッドで増減できます。これにより、特定のキーのバージョンを新しいものに変更できます。先ほどの例の続きで、下記のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Increment the version of &#39;my_key&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr_version</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># The default version still isn&#39;t available</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"go\"># Version 2 isn&#39;t available, either</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># But version 3 *is* available</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello world!&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"cache-key-transformation\">\n<span id=\"id13\"></span><h3>キャッシュキーの変換<a class=\"heading-anchor\" href=\"#cache-key-transformation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>前の2つのセクションで説明したように、ユーザから提供されたキャッシュ・キーはそのまま使用されるわけではありません。このキーは、キャッシュ・プレフィックスおよびキーバージョンと組み合わされて最終的なキャッシュ・キーとなります。デフォルトでは、3 つの部分はコロンで結合されて最終的な文字列となります:</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\">make_key</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">key_prefix</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">:</span><span class=\"si\">%s</span><span class=\"s2\">:</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">key_prefix</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>各部分をさまざまな方法で組み合わせたり、最終的なキーに他の処理を施したりしたい場合は（例えば、キーの部品のハッシュダイジェストを取るなど）、独自のキー関数を作成できます。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a> キャッシュ設定では、上記の <code class=\"docutils literal notranslate\"><span class=\"pre\">make_key()</span></code> のプロトタイプにマッチする関数へのドット区切りパスを指定します。指定された場合、デフォルトのキー結合関数の代わりにこのカスタムキー関数が使用されます。</p>\n</section>\n<section id=\"cache-key-warnings\">\n<h3>キャッシュキーの警告<a class=\"heading-anchor\" href=\"#cache-key-warnings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>最も一般的に使用されているキャッシュバックエンドである Memcached は、 250 文字より長いキャッシュキーや、空白文字や制御文字を含むキャッシュキーを許可しておらず、そのようなキーを使用すると例外が発生します。キャッシュ移植可能なコードを推奨し、不快な驚きを最小化するために、他の組み込みキャッシュバックエンドは、 memcached でエラーを引き起こすようなキーが使用された場合、警告 (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.CacheKeyWarning</span></code>) を出します。</p>\n<p>より広い範囲のキーを使用できるバックエンド (カスタムバックエンド、または非emcachedの組み込みバックエンド) を使用していて、警告を出さずにより広い範囲のキーを使用したい場合は、 <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">management</span></code> モジュールにあるこのコードで <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheKeyWarning</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\">import</span><span class=\"w\"> </span><span class=\"nn\">warnings</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CacheKeyWarning</span>\n\n<span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">simplefilter</span><span class=\"p\">(</span><span class=\"s2\">&quot;ignore&quot;</span><span class=\"p\">,</span> <span class=\"n\">CacheKeyWarning</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>組み込みのバックエンドに対してカスタムキーバリデーションのロジックを提供したい場合は、そのバックエンドをサブクラス化して <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_key</span></code> メソッドだけをオーバーライドし、 <a class=\"reference internal\" href=\"#using-a-custom-cache-backend\">using a custom cache backend</a> の説明に従ってください。たとえば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</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.core.cache.backends.locmem</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LocMemCache</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomLocMemCache</span><span class=\"p\">(</span><span class=\"n\">LocMemCache</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">validate_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Custom validation, raising exceptions or warnings as needed.&quot;&quot;&quot;</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>...そして、このクラスへのドット区切りパスを <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> 設定の <a class=\"reference internal\" href=\"/ja/5.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> 部分で使用します。</p>\n</section>\n</section>\n<section id=\"asynchronous-support\">\n<span id=\"id14\"></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<p>Django は非同期キャッシュバックエンドのサポートを開発中ですが、非同期キャッシュはまだサポートしていません。将来のリリースで対応する予定です。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.BaseCache</span></code> には <a class=\"reference internal\" href=\"#cache-basic-interface\"><span class=\"std std-ref\">全ての基本メソッド</span></a> の非同期バージョンがあります。慣習として、すべてのメソッドの非同期バージョンのプレフィックスは <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code> です。デフォルトでは、両方の引数は同じです:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">await</span> <span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">aset</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">await</span> <span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">ahas_key</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"downstream-caches\">\n<span id=\"id15\"></span><h2>ダウンストリームキャッシュ<a class=\"heading-anchor\" href=\"#downstream-caches\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>これまで、このドキュメントは自分自身が <em>持つ</em> データに焦点を当ててきました。しかし、ウェブ開発では別の種類のキャッシュも関係があります。それは、「ダウンストリーム」のキャッシュによって実行されるキャッシングです。ユーザーのために、リクエストがウェブサイトに到達する前にもページをキャッシュするシステムが存在します。</p>\n<p>ダウンストリーム キャッシュの例をいくつか挙げます。</p>\n<ul class=\"simple\">\n<li><p>HTTPを使用する場合、あなたの <abbr title=\"Internet Service Provider\">ISP</abbr> は特定のページをキャッシュすることがあります。そのため、もしあなたが <code class=\"docutils literal notranslate\"><span class=\"pre\">http://example.com/</span></code> からページをリクエストした場合、あなたのISPはexample.comに直接アクセスすることなく、あなたにそのページを送信します。example.comの管理者はこのようなキャッシュを知りません。ISPはexample.comとあなたのウェブブラウザの間に位置し、透過的にすべてのキャッシュを処理します。このようなキャッシュは、中間者攻撃（man-in-the-middle attack）となるため、HTTPSでは不可能です。</p></li>\n<li><p>あなたの Django ウェブサイトは、Squid Web Proxy Cache (<a class=\"reference external\" href=\"http://www.squid-cache.org/\">http://www.squid-cache.org/</a>) のような <em>プロキシキャッシュ</em> の背後にあるかもしれません。この場合、各リクエストはまずプロキシによって処理され、必要なときだけアプリケーションに渡されます。</p></li>\n<li><p>ウェブブラウザもページをキャッシュします。ウェブページが適切なヘッダーを送信すると、ブラウザはそのページへのその後のリクエストに、変更されたかどうかを確認するためにウェブページに再度問い合わせることなく、ローカルにキャッシュされたコピーを使用します。</p></li>\n</ul>\n<p>ダウンストリーム・キャッシュは効率性を高めてくれますが、危険性もあります。 多くのウェブページのコンテンツは、認証や他の変数のホストに基づいて異なっており、純粋にURLに基づいてやみくもにページを保存するキャッシュシステムは、それらのページにあとから訪問する人に不正確なデータや機密データを公開する可能性があります。</p>\n<p>たとえば、ウェブメールシステムを運営している場合、「受信トレイ」ページの内容は、どのユーザーがログインしているかによって異なります。もしISPがやみくもにあなたのサイトをキャッシュしていたら、そのISP経由で最初にログインしたユーザーは、そのユーザー固有の受信トレイページを、それ以降のサイト訪問者のためにキャッシュすることになります。 それはクールではありません。</p>\n<p>幸い、HTTP はこの問題の解決方法を提供しています。さまざまな HTTP ヘッダを使用することで、指定した変数に応じてキャッシュ コンテンツを変えるようにダウンストリーム キャッシュに支持したり、特定のページをキャッシュしないようにキャッシュメカニズムに伝えることができます。以下のセクションでは、こうしたヘッダの一部を見ていきます。</p>\n</section>\n<section id=\"using-vary-headers\">\n<span id=\"id16\"></span><h2><code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダーを使う<a class=\"heading-anchor\" href=\"#using-vary-headers\"><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\">Vary</span></code> ヘッダは、キャッシュメカニズムがキャッシュキーを作る際に、どのリクエストヘッダを考慮するべきかを定義します。たとえば、ウェブサイトのコンテンツがユーザーの言語設定に依存する場合、ページは「言語によって異なる (vary)」と言うことができます。</p>\n<p>デフォルトでは、Django のキャッシュシステムは、リクエストされた完全修飾 URL (たとえば <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://www.example.com/stories/2005/?order_by=author&quot;</span></code>) を使ってキャッシュキーを作成します。つまり、クッキーや 言語設定などのユーザエージェントの違いに関係なく、その URL へのリクエストはすべて同じキャッシュバージョンを使うことになります。しかし、もしこのページがリクエストヘッダの違い、例えばクッキーや言語、ユーザーエージェントの違いによって異なるコンテンツを生成するのであれば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダを使ってキャッシュ機構にページの出力がそれらに依存していることを伝える必要があります。</p>\n<p>これを Django で行うには、便利な <a class=\"reference internal\" href=\"/ja/5.0/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\">django.views.decorators.vary.vary_on_headers()</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.views.decorators.vary</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">vary_on_headers</span>\n\n\n<span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;User-Agent&quot;</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</code></pre></div>\n<p>この場合、(Django 自身のキャッシュミドルウェアのような) キャッシュ機構は、それぞれのユニークなユーザエージェントに対して、別バージョンのページをキャッシュします。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> デコレータを使用する利点は、手動で <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダーを設定する (<code class=\"docutils literal notranslate\"><span class=\"pre\">response.headers['Vary']</span> <span class=\"pre\">=</span> <span class=\"pre\">'user-agent'</span></code> のように使用する) のではなく、デコレータが <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダーに <em>追加</em> をする点にあります（これは既に存在するかもしれません）。それにより、最初から設定され、既にそこにあったものを上書きすることを避けることができます。</p>\n<p>複数のヘッダを <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers()</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=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;User-Agent&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Cookie&quot;</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</code></pre></div>\n<p>これは、下流のキャッシュに対して <em>両方</em> の vary に応じるように指示します。これは、user-agent と cookie の各組み合わせがそれぞれ独自のキャッシュ値を持つことを意味します。例えば、user-agent が <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> で cookie の値が <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=bar</span></code> のリクエストは、user-agent が <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> で cookie の値が <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=ham</span></code> のリクエストとは異なるものとみなされます。</p>\n<p>クッキーで変化することはとても一般的なので、 <a class=\"reference internal\" href=\"/ja/5.0/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\">django.views.decorators.vary.vary_on_cookie()</span></code></a> デコレータがあります。これら2つのビューは等価です:</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\">@vary_on_cookie</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=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;Cookie&quot;</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</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> に渡すヘッダは大文字小文字を区別しません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;User-Agent&quot;</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;user-agent&quot;</span></code> と同じ意味です。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/utils/#django.utils.cache.patch_vary_headers\" title=\"django.utils.cache.patch_vary_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.cache.patch_vary_headers()</span></code></a> というヘルパー関数を直接使うこともできます。この関数は <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span> <span class=\"pre\">ヘッダ</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.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">patch_vary_headers</span>\n\n\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>\n    <span class=\"o\">...</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;template_name&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n    <span class=\"n\">patch_vary_headers</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Cookie&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">patch_vary_headers</span></code> は <a class=\"reference internal\" href=\"/ja/5.0/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> インスタンスを第 1 引数に、大文字小文字を区別しないヘッダ名のリスト/タプルを第 2 引数にとります。</p>\n<p>Vary ヘッダについての詳細は <span class=\"target\" id=\"index-6\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-12.5.5\"><strong>公式な Vary の仕様</strong></a> を参照してください。</p>\n</section>\n<section id=\"controlling-cache-using-other-headers\">\n<h2>キャッシュの制御: 他のヘッダを使用する<a class=\"heading-anchor\" href=\"#controlling-cache-using-other-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>キャッシュに関するその他の問題点としては、データのプライバシーや、キャッシュの階層構造のどこにデータを保存すべきかという問題があります。</p>\n<p>ユーザーは通常2種類のキャッシュに直面します。自分のブラウザのキャッシュ（プライベートキャッシュ）とプロバイダのキャッシュ（パブリックキャッシュ）です。パブリックキャッシュは、複数のユーザーによって使用され、他の誰かによって制御されます。これは、機密データに関する問題を引き起こします。例えば、銀行の口座番号がパブリックキャッシュに保存されることは避けたいものです。そのため、ウェブアプリケーションには、どのデータがプライベートで、どのデータがパブリックであるかをキャッシュに伝える方法が必要です。</p>\n<p>解決策は、ページのキャッシュを &quot;private&quot; にすることです。これを Django で行うには、 <a class=\"reference internal\" href=\"/ja/5.0/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> ビューデコレータを使います。例:</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.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_control</span>\n\n\n<span class=\"nd\">@cache_control</span><span class=\"p\">(</span><span class=\"n\">private</span><span class=\"o\">=</span><span class=\"kc\">True</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</code></pre></div>\n<p>このデコレータは、適切な HTTP ヘッダーを背後で送信します。</p>\n<p>キャッシュ制御の設定 &quot;private&quot; と &quot;public&quot; は互いに排他的であることに注意しましょう。デコレータは、&quot;private&quot; が設定されているときは &quot;public&quot; ディレクティブを削除します (逆も同様です)。2つのディレクティブの使用例は、プライベートとパブリックのエントリを提供するブログサイトです。公開エントリは共有キャッシュにキャッシュされます。以下のコードでは <a class=\"reference internal\" href=\"/ja/5.0/ref/utils/#django.utils.cache.patch_cache_control\" title=\"django.utils.cache.patch_cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">patch_cache_control()</span></code></a> を使っています。これはキャッシュコントロールヘッダを手動で変更する方法です (内部的には <a class=\"reference internal\" href=\"/ja/5.0/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> デコレータから呼び出されます):</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.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">patch_cache_control</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.vary</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">vary_on_cookie</span>\n\n\n<span class=\"nd\">@vary_on_cookie</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">list_blog_entries_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_anonymous</span><span class=\"p\">:</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render_only_public_entries</span><span class=\"p\">()</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">public</span><span class=\"o\">=</span><span class=\"kc\">True</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\">render_private_and_public_entries</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">private</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>ダウンストリームのキャッシュは他の方法でも制御できます (HTTP キャッシュの詳細については <span class=\"target\" id=\"index-7\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html\"><strong>RFC 9111</strong></a> を参照してください)。たとえば、 Django のサーバーサイドキャッシュフレームワークを使わない場合でも、 <span class=\"target\" id=\"index-8\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html#section-5.2.2.1\"><strong>max-age</strong></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.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_control</span>\n\n\n<span class=\"nd\">@cache_control</span><span class=\"p\">(</span><span class=\"n\">max_age</span><span class=\"o\">=</span><span class=\"mi\">3600</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</code></pre></div>\n<p>(キャッシュミドルウェアを使用 <em>する</em> 場合、 <a class=\"reference internal\" href=\"/ja/5.0/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> 設定の値で <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> が既に設定されています。その場合、 <a class=\"reference internal\" href=\"/ja/5.0/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> デコレータで指定した <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> が優先され、ヘッダ値は正しくマージされます)。</p>\n<p>有効な <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> レスポンスディレクティブはすべて <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code> で有効です。以下はその例です:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">no_transform=True</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">must_revalidate=True</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">stale_while_revalidate=num_seconds</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">no_cache=True</span></code></p></li>\n</ul>\n<p>既知のディレクティブの全リストは <a class=\"reference external\" href=\"https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\">IANA registry</a> にあります (すべてのディレクティブがレスポンスに適用されるわけではないことに注意してください)。</p>\n<p>ヘッダーを使用してキャッシュを完全に無効にしたい場合は、 <a class=\"reference internal\" href=\"/ja/5.0/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">never_cache()</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.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">never_cache</span>\n\n\n<span class=\"nd\">@never_cache</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">myview</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"order-of-middleware\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code> の順序<a class=\"heading-anchor\" href=\"#order-of-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>キャッシュミドルウェアを使用する場合、下記の2つを <a class=\"reference internal\" href=\"/ja/5.0/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\">Vary</span></code> レスポンスヘッダに何かを追加します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> はレスポンスフェーズの間に実行され、ミドルウェアは逆順に実行されるため、リストの先頭にある項目はレスポンスフェーズの間、 <em>最後に</em> 実行されます。したがって、 <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> が <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダに何かを追加する可能性のある他のミドルウェアの <em>前に</em> 配置されていることを確認する必要があります。以下のミドルウェアモジュールは <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダに何らかのものを追加します:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Cookie</span></code> を追加します</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">GZipMiddleware</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Encoding</span></code> を追加します</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Language</span></code> を追加します</p></li>\n</ul>\n<p>一方、<code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> はリクエストフェーズで実行され、このフェーズではミドルウェアが先頭から最後にかけて適用されるため、リストの上部にあるアイテムはリクエストフェーズの <em>最初</em> に実行されます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> もまた、他のミドルウェアが <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダーを更新した後に実行する必要があるので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> は <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ヘッダーを更新するようなアイテムの <em>後</em> になければなりません。</p>\n</section>","rootId":"django-s-cache-framework","toc":[{"title":"キャッシュのセットアップ","anchor":"setting-up-the-cache","children":[{"title":"Memcached","anchor":"memcached","children":[]},{"title":"Redis","anchor":"redis","children":[]},{"title":"データベースのキャッシュ","anchor":"database-caching","children":[{"title":"キャッシュテーブルを作成する","anchor":"creating-the-cache-table","children":[]},{"title":"複数のデータベース","anchor":"multiple-databases","children":[]}]},{"title":"ファイルシステムのキャッシュ","anchor":"filesystem-caching","children":[]},{"title":"ローカルメモリのキャッシュ","anchor":"local-memory-caching","children":[]},{"title":"ダミーキャッシュ（開発用）","anchor":"dummy-caching-for-development","children":[]},{"title":"独自のキャッシュバックエンドを使う","anchor":"using-a-custom-cache-backend","children":[]},{"title":"キャッシュ引数","anchor":"cache-arguments","children":[]}]},{"title":"サイトごとのキャッシュ","anchor":"the-per-site-cache","children":[]},{"title":"ビューごとのキャッシュ","anchor":"the-per-view-cache","children":[{"title":"ビューごとのキャッシュを URLconf で指定する","anchor":"specifying-per-view-cache-in-the-urlconf","children":[]}]},{"title":"テンプレートフラグメントのキャッシュ","anchor":"template-fragment-caching","children":[]},{"title":"低レベルキャッシュ API","anchor":"the-low-level-cache-api","children":[{"title":"キャッシュへのアクセス","anchor":"accessing-the-cache","children":[]},{"title":"基本的な使用法","anchor":"basic-usage","children":[]},{"title":"キャッシュ キーにプレフィックスを付ける","anchor":"cache-key-prefixing","children":[]},{"title":"キャッシュのバージョン管理","anchor":"cache-versioning","children":[]},{"title":"キャッシュキーの変換","anchor":"cache-key-transformation","children":[]},{"title":"キャッシュキーの警告","anchor":"cache-key-warnings","children":[]}]},{"title":"非同期サポート","anchor":"asynchronous-support","children":[]},{"title":"ダウンストリームキャッシュ","anchor":"downstream-caches","children":[]},{"title":"Vary ヘッダーを使う","anchor":"using-vary-headers","children":[]},{"title":"キャッシュの制御: 他のヘッダを使用する","anchor":"controlling-cache-using-other-headers","children":[]},{"title":"MIDDLEWARE の順序","anchor":"order-of-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.0/topics/"}],"prev":{"docname":"topics/auth/customizing","title":"Django の認証方法のカスタマイズ","url":"/ja/5.0/topics/auth/customizing/"},"next":{"docname":"topics/conditional-view-processing","title":"条件付きのビュー処理","url":"/ja/5.0/topics/conditional-view-processing/"},"formats":{"html":"/ja/5.0/topics/cache/","markdown":"/ja/5.0/topics/cache.md","json":"/ja/5.0/topics/cache.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/topics/cache.txt","official":"https://docs.djangoproject.com/ja/5.0/topics/cache/","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","it","pt-br","ko","es","el","pl"]}