{"title":"Django's cache framework","version":"3.1","locale":"ja","docname":"topics/cache","url":"/ja/3.1/topics/cache/","canonical":"https://djangodocs.dev/ja/3.1/topics/cache/","summary":"A fundamental trade-off in dynamic websites is, well, they're dynamic. Each time a user requests a page, the Web server makes all sorts of calculations -- from…","html":"<h1>Django's cache framework<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>A fundamental trade-off in dynamic websites is, well, they're dynamic. Each\ntime a user requests a page, the Web server makes all sorts of calculations --\nfrom database queries to template rendering to business logic -- to create the\npage that your site's visitor sees. This is a lot more expensive, from a\nprocessing-overhead perspective, than your standard\nread-a-file-off-the-filesystem server arrangement.</p>\n<p>For most Web applications, this overhead isn't a big deal. Most Web\napplications aren't <code class=\"docutils literal notranslate\"><span class=\"pre\">washingtonpost.com</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">slashdot.org</span></code>; they're small-\nto medium-sized sites with so-so traffic. But for medium- to high-traffic\nsites, it's essential to cut as much overhead as possible.</p>\n<p>That's where caching comes in.</p>\n<p>To cache something is to save the result of an expensive calculation so that\nyou don't have to perform the calculation next time. Here's some pseudocode\nexplaining how this would work for a dynamically generated Web page:</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\">given</span> <span class=\"n\">a</span> <span class=\"n\">URL</span><span class=\"p\">,</span> <span class=\"k\">try</span> <span class=\"n\">finding</span> <span class=\"n\">that</span> <span class=\"n\">page</span> <span class=\"ow\">in</span> <span class=\"n\">the</span> <span class=\"n\">cache</span>\n<span class=\"k\">if</span> <span class=\"n\">the</span> <span class=\"n\">page</span> <span class=\"ow\">is</span> <span class=\"ow\">in</span> <span class=\"n\">the</span> <span class=\"n\">cache</span><span class=\"p\">:</span>\n    <span class=\"k\">return</span> <span class=\"n\">the</span> <span class=\"n\">cached</span> <span class=\"n\">page</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">generate</span> <span class=\"n\">the</span> <span class=\"n\">page</span>\n    <span class=\"n\">save</span> <span class=\"n\">the</span> <span class=\"n\">generated</span> <span class=\"n\">page</span> <span class=\"ow\">in</span> <span class=\"n\">the</span> <span class=\"n\">cache</span> <span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nb\">next</span> <span class=\"n\">time</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">the</span> <span class=\"n\">generated</span> <span class=\"n\">page</span>\n</code></pre></div>\n<p>Django comes with a robust cache system that lets you save dynamic pages so\nthey don't have to be calculated for each request. For convenience, Django\noffers different levels of cache granularity: You can cache the output of\nspecific views, you can cache only the pieces that are difficult to produce,\nor you can cache your entire site.</p>\n<p>Django also works well with &quot;downstream&quot; caches, such as <a class=\"reference external\" href=\"http://www.squid-cache.org\">Squid</a> and browser-based caches. These are the types of\ncaches that you don't directly control but to which you can provide hints (via\nHTTP headers) about which parts of your site should be cached, and how.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p>The <a class=\"reference internal\" href=\"/ja/3.1/misc/design-philosophies/#cache-design-philosophy\"><span class=\"std std-ref\">Cache Framework design philosophy</span></a>\nexplains a few of the design decisions of the framework.</p>\n</aside>\n<section id=\"setting-up-the-cache\">\n<span id=\"id1\"></span><h2>Setting up the cache<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>The cache system requires a small amount of setup. Namely, you have to tell it\nwhere your cached data should live -- whether in a database, on the filesystem\nor directly in memory. This is an important decision that affects your cache's\nperformance; yes, some cache types are faster than others.</p>\n<p>Your cache preference goes in the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting in your\nsettings file. Here's an explanation of all available values for\n<a class=\"reference internal\" href=\"/ja/3.1/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>The fastest, most efficient type of cache supported natively by Django,\n<a class=\"reference external\" href=\"https://memcached.org/\">Memcached</a> is an entirely memory-based cache server, originally developed\nto handle high loads at LiveJournal.com and subsequently open-sourced by\nDanga Interactive. It is used by sites such as Facebook and Wikipedia to\nreduce database access and dramatically increase site performance.</p>\n<p>Memcached runs as a daemon and is allotted a specified amount of RAM. All it\ndoes is provide a fast interface for adding, retrieving and deleting data in\nthe cache. All data is stored directly in memory, so there's no overhead of\ndatabase or filesystem usage.</p>\n<p>After installing Memcached itself, you'll need to install a Memcached\nbinding. There are several Python Memcached bindings available; the\ntwo most common are <a class=\"reference external\" href=\"https://pypi.org/project/python-memcached/\">python-memcached</a> and <a class=\"reference external\" href=\"https://pypi.org/project/pylibmc/\">pylibmc</a>.</p>\n<p>To use Memcached with Django:</p>\n<ul class=\"simple\">\n<li><p>Set <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.MemcachedCache</span></code> or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyLibMCCache</span></code> (depending\non your chosen memcached binding)</p></li>\n<li><p>Set <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">ip:port</span></code> values,\nwhere <code class=\"docutils literal notranslate\"><span class=\"pre\">ip</span></code> is the IP address of the Memcached daemon and <code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code> is the\nport on which Memcached is running, or to a <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:path</span></code> value, where\n<code class=\"docutils literal notranslate\"><span class=\"pre\">path</span></code> is the path to a Memcached Unix socket file.</p></li>\n</ul>\n<p>In this example, Memcached is running on localhost (127.0.0.1) port 11211, using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</span></code> binding:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.MemcachedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;127.0.0.1:11211&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>In this example, Memcached is available through a local Unix socket file\n<code class=\"file docutils literal notranslate\"><span class=\"pre\">/tmp/memcached.sock</span></code> using the <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</span></code> binding:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.MemcachedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;unix:/tmp/memcached.sock&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>When using the <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> binding, do not include the <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:/</span></code> prefix:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.PyLibMCCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/tmp/memcached.sock&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>One excellent feature of Memcached is its ability to share a cache over\nmultiple servers. This means you can run Memcached daemons on multiple\nmachines, and the program will treat the group of machines as a <em>single</em>\ncache, without the need to duplicate cache values on each machine. To take\nadvantage of this feature, include all server addresses in\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>, either as a semicolon or comma\ndelimited string, or as a list.</p>\n<p>In this example, the cache is shared over Memcached instances running on IP\naddress 172.19.26.240 and 172.19.26.242, both on port 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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.MemcachedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s1\">&#39;172.19.26.240:11211&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;172.19.26.242:11211&#39;</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>In the following example, the cache is shared over Memcached instances running\non the IP addresses 172.19.26.240 (port 11211), 172.19.26.242 (port 11212), and\n172.19.26.244 (port 11213):</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.MemcachedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s1\">&#39;172.19.26.240:11211&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;172.19.26.242:11212&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;172.19.26.244:11213&#39;</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>A final point about Memcached is that memory-based caching has a\ndisadvantage: because the cached data is stored in memory, the data will be\nlost if your server crashes. Clearly, memory isn't intended for permanent data\nstorage, so don't rely on memory-based caching as your only data storage.\nWithout a doubt, <em>none</em> of the Django caching backends should be used for\npermanent storage -- they're all intended to be solutions for caching, not\nstorage -- but we point this out here because memory-based caching is\nparticularly temporary.</p>\n</section>\n<section id=\"database-caching\">\n<span id=\"id4\"></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/3.1/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/3.1/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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.db.DatabaseCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;my_cache_table&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\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=\"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\">python</span> <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span> <span class=\"n\">createcachetable</span>\n</code></pre></div>\n<p>このコマンドにより、データベース内に1つのテーブルが作成され、Django のデータベースキャッシュシステムに必要な適切なフォーマットが生成されます。テーブルの名前は <a class=\"reference internal\" href=\"/ja/3.1/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/3.1/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/3.1/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/3.1/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/3.1/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/3.1/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>If you use database caching with multiple databases, you'll also need\nto set up routing instructions for your database cache table. For the\npurposes of routing, the database cache table appears as a model named\n<code class=\"docutils literal notranslate\"><span class=\"pre\">CacheEntry</span></code>, in an application named <code class=\"docutils literal notranslate\"><span class=\"pre\">django_cache</span></code>. This model\nwon't appear in the models cache, but the model details can be used\nfor routing purposes.</p>\n<p>For example, the following router would direct all cache read\noperations to <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_replica</span></code>, and all write operations to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code>. The cache table will only be synchronized onto\n<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=\"s1\">&#39;django_cache&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;cache_replica&#39;</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=\"s1\">&#39;django_cache&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s1\">&#39;cache_primary&#39;</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=\"s1\">&#39;django_cache&#39;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">db</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;cache_primary&#39;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>If you don't specify routing directions for the database cache model,\nthe cache backend will use the <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> database.</p>\n<p>And if you don't use the database cache backend, you don't need to worry about\nproviding routing instructions for the database cache model.</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>The file-based backend serializes and stores each cache value as a separate\nfile. To use this backend set <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> to\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span></code> and\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> to a suitable directory. For example,\nto store cached data in <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code>, use this setting:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.filebased.FileBasedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/var/tmp/django_cache&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>If you're on Windows, put the drive letter at the beginning of the path,\nlike this:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.filebased.FileBasedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;c:/foo/bar&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>The directory path should be absolute -- that is, it should start at the root\nof your filesystem. It doesn't matter whether you put a slash at the end of the\nsetting.</p>\n<p>Make sure the directory pointed-to by this setting either exists and is\nreadable and writable, or that it can be created by the system user under which\nyour Web server runs. Continuing the above example, if your server runs as the\nuser <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>, make sure the directory <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code> exists and\nis readable and writable by the user <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>, or that it can be created by\nthe user <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>.</p>\n</section>\n<section id=\"local-memory-caching\">\n<span id=\"id5\"></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>This is the default cache if another is not specified in your settings file. If\nyou want the speed advantages of in-memory caching but don't have the capability\nof running Memcached, consider the local-memory cache backend. This cache is\nper-process (see below) and thread-safe. To use it, set <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span></code>. For\nexample:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.locmem.LocMemCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;unique-snowflake&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>The cache <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> is used to identify individual\nmemory stores. If you only have one <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code> cache, you can omit the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>; however, if you have more than one local\nmemory cache, you will need to assign a name to at least one of them in\norder to keep them separate.</p>\n<p>The cache uses a least-recently-used (LRU) culling strategy.</p>\n<p>Note that each process will have its own private cache instance, which means no\ncross-process caching is possible. This also means the local memory cache isn't\nparticularly memory-efficient, so it's probably not a good choice for\nproduction environments. It's nice for development.</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>Finally, Django comes with a &quot;dummy&quot; cache that doesn't actually cache -- it\njust implements the cache interface without doing anything.</p>\n<p>This is useful if you have a production site that uses heavy-duty caching in\nvarious places but a development/test environment where you don't want to cache\nand don't want to have to change your code to special-case the latter. To\nactivate dummy caching, set <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> like so:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.dummy.DummyCache&#39;</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>独自のキャッシュbackendを使う<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>While Django includes support for a number of cache backends out-of-the-box,\nsometimes you might want to use a customized cache backend. To use an external\ncache backend with Django, use the Python import path as the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> of the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting, like so:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;path.to.backend&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>If you're building your own backend, you can use the standard cache backends\nas reference implementations. You'll find the code in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django/core/cache/backends/</span></code> directory of the Django source.</p>\n<p>Note: Without a really compelling reason, such as a host that doesn't support\nthem, you should stick to the cache backends included with Django. They've\nbeen well-tested and are well-documented.</p>\n</section>\n<section id=\"cache-arguments\">\n<span id=\"id6\"></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>Each cache backend can be given additional arguments to control caching\nbehavior. These arguments are provided as additional keys in the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting. Valid arguments are as follows:</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code></a>: The default timeout, in\nseconds, to use for the cache. This argument defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code> seconds (5 minutes).\nYou can set <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> so that, by default, cache keys never\nexpire. A value of <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> causes keys to immediately expire (effectively\n&quot;don't cache&quot;).</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>: Any options that should be\npassed to the cache backend. The list of valid options will vary\nwith each backend, and cache backends backed by a third-party library\nwill pass their options directly to the underlying cache library.</p>\n<p>Cache backends that implement their own culling strategy (i.e.,\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filesystem</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code> backends) will\nhonor the following options:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code>: The maximum number of entries allowed in\nthe cache before old values are deleted. This argument\ndefaults to <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>: The fraction of entries that are culled\nwhen <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> is reached. The actual ratio is\n<code class=\"docutils literal notranslate\"><span class=\"pre\">1</span> <span class=\"pre\">/</span> <span class=\"pre\">CULL_FREQUENCY</span></code>, so set <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> to\ncull half the entries when <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> is reached. This argument\nshould be an integer and defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">3</span></code>.</p>\n<p>A value of <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> for <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> means that the\nentire cache will be dumped when <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> is reached.\nOn some backends (<code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code> in particular) this makes culling <em>much</em>\nfaster at the expense of more cache misses.</p>\n</li>\n</ul>\n<p>Memcached backends pass the contents of <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>\nas keyword arguments to the client constructors, allowing for more advanced\ncontrol of client behavior. For example usage, see below.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>: A string that will be\nautomatically included (prepended by default) to all cache keys\nused by the Django server.</p>\n<p>See the <a class=\"reference internal\" href=\"#cache-key-prefixing\"><span class=\"std std-ref\">cache documentation</span></a> for\nmore information.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>: The default version number\nfor cache keys generated by the Django server.</p>\n<p>See the <a class=\"reference internal\" href=\"#cache-versioning\"><span class=\"std std-ref\">cache documentation</span></a> for more\ninformation.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a>\nA string containing a dotted path to a function that defines how\nto compose a prefix, version and key into a final cache key.</p>\n<p>See the <a class=\"reference internal\" href=\"#cache-key-transformation\"><span class=\"std std-ref\">cache documentation</span></a>\nfor more information.</p>\n</li>\n</ul>\n<p>In this example, a filesystem backend is being configured with a timeout\nof 60 seconds, and a maximum capacity of 1000 items:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.filebased.FileBasedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/var/tmp/django_cache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;TIMEOUT&#39;</span><span class=\"p\">:</span> <span class=\"mi\">60</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;MAX_ENTRIES&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1000</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Here's an example configuration for a <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</span></code> based backend with\nan object size limit of 2MB:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.MemcachedCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;127.0.0.1:11211&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;server_max_value_length&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1024</span> <span class=\"o\">*</span> <span class=\"mi\">1024</span> <span class=\"o\">*</span> <span class=\"mi\">2</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>Here's an example configuration for a <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> based backend that enables\nthe binary protocol, SASL authentication, and the <code class=\"docutils literal notranslate\"><span class=\"pre\">ketama</span></code> behavior mode:</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=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;BACKEND&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.core.cache.backends.memcached.PyLibMCCache&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;LOCATION&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;127.0.0.1:11211&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;binary&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;username&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;user&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;password&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;pass&#39;</span><span class=\"p\">,</span>\n            <span class=\"s1\">&#39;behaviors&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s1\">&#39;ketama&#39;</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</section>\n</section>\n<section id=\"the-per-site-cache\">\n<span id=\"id7\"></span><h2>The per-site cache<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>Once the cache is set up, the simplest way to use caching is to cache your\nentire site. You'll need to add\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.UpdateCacheMiddleware'</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.FetchFromCacheMiddleware'</span></code> to your\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> setting, as in this example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;django.middleware.cache.UpdateCacheMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.common.CommonMiddleware&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.middleware.cache.FetchFromCacheMiddleware&#39;</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>No, that's not a typo: the &quot;update&quot; middleware must be first in the list,\nand the &quot;fetch&quot; middleware must be last. The details are a bit obscure, but\nsee <a class=\"reference internal\" href=\"#order-of-middleware\">Order of MIDDLEWARE</a> below if you'd like the full story.</p>\n</aside>\n<p>Then, add the following required settings to your Django settings file:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/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> -- The cache alias to use for storage.</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/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> -- The number of seconds each page should\nbe cached.</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/3.1/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> -- If the cache is shared across\nmultiple sites using the same Django installation, set this to the name of\nthe site, or some other string that is unique to this Django instance, to\nprevent key collisions. Use an empty string if you don't care.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> caches GET and HEAD responses with status 200,\nwhere the request and response headers allow. Responses to requests for the same\nURL with different query parameters are considered to be unique pages and are\ncached separately. This middleware expects that a HEAD request is answered with\nthe same response headers as the corresponding GET request; in which case it can\nreturn a cached GET response for HEAD request.</p>\n<p>Additionally, <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> automatically sets a few headers in\neach <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> which affect <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">downstream caches</span></a>:</p>\n<ul class=\"simple\">\n<li><p>Sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> header to the current date/time plus the defined\n<a class=\"reference internal\" href=\"/ja/3.1/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>Sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> header to give a max age for the page --\nagain, from the <a class=\"reference internal\" href=\"/ja/3.1/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> setting.</p></li>\n</ul>\n<p>See <a class=\"reference internal\" href=\"/ja/3.1/topics/http/middleware/\"><span class=\"doc\">ミドルウェア (Middleware)</span></a> for more on middleware.</p>\n<p>If a view sets its own cache expiry time (i.e. it has a <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> section in\nits <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> header) then the page will be cached until the expiry\ntime, rather than <a class=\"reference internal\" href=\"/ja/3.1/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>. Using the decorators in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> you can easily set a view's expiry time\n(using the <a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> decorator) or\ndisable caching for a view (using the\n<a class=\"reference internal\" href=\"/ja/3.1/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> decorator). See the\n<a class=\"reference internal\" href=\"#controlling-cache-using-other-headers\">using other headers</a> section for more on these decorators.</p>\n<p id=\"i18n-cache-key\">If <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> then the generated cache key will\ninclude the name of the active <a class=\"reference internal\" href=\"/ja/3.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> -- see also\n<a class=\"reference internal\" href=\"/ja/3.1/topics/i18n/translation/#how-django-discovers-language-preference\"><span class=\"std std-ref\">How Django discovers language preference</span></a>). This allows you to easily\ncache multilingual sites without having to create the cache key yourself.</p>\n<p>Cache keys also include the active <a class=\"reference internal\" href=\"/ja/3.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> when\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-USE_L10N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_L10N</span></code></a> is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> and the <a class=\"reference internal\" href=\"/ja/3.1/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">current time zone</span></a> when <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</section>\n<section id=\"the-per-view-cache\">\n<h2>The per-view cache<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><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>A more granular way to use the caching framework is by caching the output of\nindividual views. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> defines a <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code>\ndecorator that will automatically cache the view's response for you:</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=\"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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> takes a single argument: the cache timeout, in seconds. In the\nabove example, the result of the <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view()</span></code> view will be cached for 15\nminutes. (Note that we've written it as <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> for the purpose of\nreadability. <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> will be evaluated to <code class=\"docutils literal notranslate\"><span class=\"pre\">900</span></code> -- that is, 15 minutes\nmultiplied by 60 seconds per minute.)</p>\n<p>The cache timeout set by <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> takes precedence over the <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code>\ndirective from the <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> header.</p>\n<p>The per-view cache, like the per-site cache, is keyed off of the URL. If\nmultiple URLs point at the same view, each URL will be cached separately.\nContinuing the <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> example, if your URLconf looks like this:</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=\"s1\">&#39;foo/&lt;int:code&gt;/&#39;</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>then requests to <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/1/</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code> will be cached separately, as\nyou may expect. But once a particular URL (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code>) has been\nrequested, subsequent requests to that URL will use the cache.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> can also take an optional keyword argument, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>,\nwhich directs the decorator to use a specific cache (from your\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting) when caching view results. By default, the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> cache will be used, but you can specify any cache you\nwant:</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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>You can also override the cache prefix on a per-view basis. <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code>\ntakes an optional keyword argument, <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code>,\nwhich works in the same way as the <a class=\"reference internal\" href=\"/ja/3.1/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>\nsetting for the middleware.  It can be used like this:</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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> arguments may be specified together. The\n<code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> argument and the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>\nspecified under <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> will be concatenated.</p>\n<p>Additionally, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> automatically sets <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> headers in the response which affect <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">downstream caches</span></a>.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>In older versions, the <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> directive from the <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code>\nheader had precedence over the cache timeout set by <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code>.</p>\n</aside>\n<section id=\"specifying-per-view-cache-in-the-urlconf\">\n<h3>Specifying per-view cache in the 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>The examples in the previous section have hard-coded the fact that the view is\ncached, because <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> alters the <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> function in place. This\napproach couples your view to the cache system, which is not ideal for several\nreasons. For instance, you might want to reuse the view functions on another,\ncache-less site, or you might want to distribute the views to people who might\nwant to use them without being cached. The solution to these problems is to\nspecify the per-view cache in the URLconf rather than next to the view functions\nthemselves.</p>\n<p>You can do so by wrapping the view function with <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> when you refer\nto it in the URLconf. Here's the old URLconf from earlier:</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=\"s1\">&#39;foo/&lt;int:code&gt;/&#39;</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>Here's the same thing, with <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> wrapped in <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=\"s1\">&#39;foo/&lt;int:code&gt;/&#39;</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>Template fragment caching<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>If you're after even more control, you can also cache template fragments using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> template tag. To give your template access to this tag, put\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> near the top of your template.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> template tag caches the contents of the block for a given\namount of time. It takes at least two arguments: the cache timeout, in seconds,\nand the name to give the cache fragment. The fragment is cached forever if\ntimeout is <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. The name will be taken as is, do not use a variable. For\nexample:</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>Sometimes you might want to cache multiple copies of a fragment depending on\nsome dynamic data that appears inside the fragment. For example, you might want a\nseparate cached copy of the sidebar used in the previous example for every user\nof your site. Do this by passing one or more additional arguments, which may be\nvariables with or without filters, to the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> template tag to\nuniquely identify the cache fragment:</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>If <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> the per-site middleware cache will\n<a class=\"reference internal\" href=\"#i18n-cache-key\"><span class=\"std std-ref\">respect the active language</span></a>. For the <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> template\ntag you could use one of the\n<a class=\"reference internal\" href=\"/ja/3.1/topics/i18n/translation/#template-translation-vars\"><span class=\"std std-ref\">translation-specific variables</span></a> available in\ntemplates to achieve the same result:</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>The cache timeout can be a template variable, as long as the template variable\nresolves to an integer value. For example, if the template variable\n<code class=\"docutils literal notranslate\"><span class=\"pre\">my_timeout</span></code> is set to the value <code class=\"docutils literal notranslate\"><span class=\"pre\">600</span></code>, then the following two examples are\nequivalent:</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>This feature is useful in avoiding repetition in templates. You can set the\ntimeout in a variable, in one place, and reuse that value.</p>\n<p>By default, the cache tag will try to use the cache called &quot;template_fragments&quot;.\nIf no such cache exists, it will fall back to using the default cache. You may\nselect an alternate cache backend to use with the <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code> keyword argument,\nwhich must be the last argument to the tag.</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>It is considered an error to specify a cache name that is not configured.</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>If you want to obtain the cache key used for a cached fragment, you can use\n<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> is the same as second argument\nto the <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> template tag; <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on</span></code> is a list of all additional arguments\npassed to the tag. This function can be useful for invalidating or overwriting\na cached item, for example:</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=\"s1\">&#39;sidebar&#39;</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>The low-level cache 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>Sometimes, caching an entire rendered page doesn't gain you very much and is,\nin fact, inconvenient overkill.</p>\n<p>Perhaps, for instance, your site includes a view whose results depend on\nseveral expensive queries, the results of which change at different intervals.\nIn this case, it would not be ideal to use the full-page caching that the\nper-site or per-view cache strategies offer, because you wouldn't want to\ncache the entire result (since some of the data changes often), but you'd still\nwant to cache the results that rarely change.</p>\n<p>For cases like this, Django exposes a low-level cache API. You can use this API\nto store objects in the cache with any level of granularity you like.  You can\ncache any Python object that can be pickled safely: strings, dictionaries,\nlists of model objects, and so forth. (Most common Python objects can be\npickled; refer to the Python documentation for more information about\npickling.)</p>\n<section id=\"accessing-the-cache\">\n<h3>Accessing the cache<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>You can access the caches configured in the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting\nthrough a dict-like object: <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.caches</span></code>. Repeated\nrequests for the same alias in the same thread will return the same\nobject.</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=\"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=\"s1\">&#39;myalias&#39;</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=\"s1\">&#39;myalias&#39;</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>If the named key does not exist, <code class=\"docutils literal notranslate\"><span class=\"pre\">InvalidCacheBackendError</span></code> will be\nraised.</p>\n<p>To provide thread-safety, a different instance of the cache backend will\nbe returned for each thread.</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>As a shortcut, the default cache is available as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.cache</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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>This object is equivalent to <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<h3>Basic usage<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>The basic interface is:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.cache.set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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=\"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=\"s1\">&#39;my_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;hello, world!&#39;</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.cache.get\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><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=\"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=\"s1\">&#39;my_key&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello, world!&#39;</span>\n</code></pre></div>\n</dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> should be a <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> can be any picklable Python object.</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> argument is optional and defaults to the <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> argument\nof the appropriate backend in the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting (explained above).\nIt's the number of seconds the value should be stored in the cache. Passing in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> for <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> will cache the value forever. A <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> of <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>\nwon't cache the value.</p>\n<p>If the object doesn't exist in the cache, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> returns <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_key&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n</code></pre></div>\n<p>If you need to determine whether the object exists in the cache and you have\nstored a literal value <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, use a sentinel object as the default:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_key&#39;</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=\"s1\">&#39;my_key&#39;</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<aside class=\"admonition-memcachedcache admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">MemcachedCache</span></code></p>\n<p>Due to a <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</span></code> limitation, it's not possible to distinguish\nbetween stored <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> value and a cache miss signified by a return value\nof <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> on the deprecated <code class=\"docutils literal notranslate\"><span class=\"pre\">MemcachedCache</span></code> backend.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> can take a <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> argument. This specifies which value to\nreturn if the object doesn't exist in the cache:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;has expired&#39;</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.caches.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.caches.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>To add a key only if it doesn't already exist, use the <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> method.\nIt takes the same parameters as <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code>, but it will not attempt to\nupdate the cache if the key specified is already present:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;add_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Initial value&#39;</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=\"s1\">&#39;add_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;New value&#39;</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=\"s1\">&#39;add_key&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;Initial value&#39;</span>\n</code></pre></div>\n<p>If you need to know whether <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> stored a value in the cache, you can\ncheck the return value. It will return <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the value was stored,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> otherwise.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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>If you want to get a key's value or set a value if the key isn't in the cache,\nthere is the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_set()</span></code> method. It takes the same parameters as <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>\nbut the default is set as the new cache value for that key, rather than\nreturned:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_new_key&#39;</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=\"s1\">&#39;my_new_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;my new value&#39;</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>You can also pass any callable as a <em>default</em> value:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;some-timestamp-key&#39;</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.caches.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.caches.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>There's also a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> interface that only hits the cache once.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> returns a dictionary with all the keys you asked for that\nactually exist in the cache (and haven't expired):</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;a&#39;</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=\"s1\">&#39;b&#39;</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=\"s1\">&#39;c&#39;</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=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</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.caches.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.caches.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>To set multiple values more efficiently, use <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> to pass a dictionary\nof key-value pairs:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;a&#39;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</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=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</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>Like <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.set()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> takes an optional <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> parameter.</p>\n<p>On supported backends (memcached), <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> returns a list of keys that\nfailed to be inserted.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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>You can delete keys explicitly with <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> to clear the cache for a\nparticular object:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;a&#39;</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> returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the key was successfully deleted, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>\notherwise.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>The boolean return value was added.</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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>If you want to clear a bunch of keys at once, <code class=\"docutils literal notranslate\"><span class=\"pre\">delete_many()</span></code> can take a list\nof keys to be cleared:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;a&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;b&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;c&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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>Finally, if you want to delete all the keys in the cache, use\n<code class=\"docutils literal notranslate\"><span class=\"pre\">cache.clear()</span></code>.  Be careful with this; <code class=\"docutils literal notranslate\"><span class=\"pre\">clear()</span></code> will remove <em>everything</em>\nfrom the cache, not just the keys set by your application.</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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.caches.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.caches.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> sets a new expiration for a key. For example, to update a key\nto expire 10 seconds from now:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;a&#39;</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>Like other methods, the <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> argument is optional and defaults to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> option of the appropriate backend in the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the key was successfully touched, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>\notherwise.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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.caches.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.caches.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>You can also increment or decrement a key that already exists using the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">incr()</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code> methods, respectively. By default, the existing cache\nvalue will be incremented or decremented by 1. Other increment/decrement values\ncan be specified by providing an argument to the increment/decrement call. A\nValueError will be raised if you attempt to increment or decrement a\nnonexistent cache key.:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;num&#39;</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=\"s1\">&#39;num&#39;</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=\"s1\">&#39;num&#39;</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=\"s1\">&#39;num&#39;</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=\"s1\">&#39;num&#39;</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> methods are not guaranteed to be atomic. On those\nbackends that support atomic increment/decrement (most notably, the\nmemcached backend), increment and decrement operations will be atomic.\nHowever, if the backend doesn't natively provide an increment/decrement\noperation, it will be implemented using a two-step retrieve/update.</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.caches.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.caches.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>You can close the connection to your cache with <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> if implemented by\nthe cache backend.</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=\"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>For caches that don't implement <code class=\"docutils literal notranslate\"><span class=\"pre\">close</span></code> methods it is a no-op.</p>\n</aside>\n</section>\n<section id=\"cache-key-prefixing\">\n<span id=\"id9\"></span><h3>Cache key prefixing<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>If you are sharing a cache instance between servers, or between your\nproduction and development environments, it's possible for data cached\nby one server to be used by another server. If the format of cached\ndata is different between servers, this can lead to some very hard to\ndiagnose problems.</p>\n<p>To prevent this, Django provides the ability to prefix all cache keys\nused by a server. When a particular cache key is saved or retrieved,\nDjango will automatically prefix the cache key with the value of the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> cache setting.</p>\n<p>By ensuring each Django instance has a different\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>, you can ensure that there will be no\ncollisions in cache values.</p>\n</section>\n<section id=\"cache-versioning\">\n<span id=\"id10\"></span><h3>Cache versioning<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>When you change running code that uses cached values, you may need to\npurge any existing cached values. The easiest way to do this is to\nflush the entire cache, but this can lead to the loss of cache values\nthat are still valid and useful.</p>\n<p>Django provides a better way to target individual cache values.\nDjango's cache framework has a system-wide version identifier,\nspecified using the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a> cache setting.\nThe value of this setting is automatically combined with the cache\nprefix and the user-provided cache key to obtain the final cache key.</p>\n<p>By default, any key request will automatically include the site\ndefault cache key version. However, the primitive cache functions all\ninclude a <code class=\"docutils literal notranslate\"><span class=\"pre\">version</span></code> argument, so you can specify a particular cache\nkey version to set or get. For example:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_key&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;hello world!&#39;</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=\"s1\">&#39;my_key&#39;</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=\"s1\">&#39;my_key&#39;</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>The version of a specific key can be incremented and decremented using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">incr_version()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">decr_version()</span></code> methods. This\nenables specific keys to be bumped to a new version, leaving other\nkeys unaffected. Continuing our previous example:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;my_key&#39;</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=\"s1\">&#39;my_key&#39;</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=\"s1\">&#39;my_key&#39;</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=\"s1\">&#39;my_key&#39;</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=\"id11\"></span><h3>Cache key transformation<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>As described in the previous two sections, the cache key provided by a\nuser is not used verbatim -- it is combined with the cache prefix and\nkey version to provide a final cache key. By default, the three parts\nare joined using colons to produce a final string:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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=\"s1\">&#39;</span><span class=\"si\">%s</span><span class=\"s1\">:</span><span class=\"si\">%s</span><span class=\"s1\">:</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</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>If you want to combine the parts in different ways, or apply other\nprocessing to the final key (e.g., taking a hash digest of the key\nparts), you can provide a custom key function.</p>\n<p>The <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a> cache setting\nspecifies a dotted-path to a function matching the prototype of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">make_key()</span></code> above. If provided, this custom key function will\nbe used instead of the default key combining function.</p>\n</section>\n<section id=\"cache-key-warnings\">\n<h3>Cache key warnings<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, the most commonly-used production cache backend, does not allow\ncache keys longer than 250 characters or containing whitespace or control\ncharacters, and using such keys will cause an exception. To encourage\ncache-portable code and minimize unpleasant surprises, the other built-in cache\nbackends issue a warning (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.CacheKeyWarning</span></code>)\nif a key is used that would cause an error on memcached.</p>\n<p>If you are using a production backend that can accept a wider range of keys (a\ncustom backend, or one of the non-memcached built-in backends), and want to use\nthis wider range without warnings, you can silence <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheKeyWarning</span></code> with\nthis code in the <code class=\"docutils literal notranslate\"><span class=\"pre\">management</span></code> module of one of your\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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>If you want to instead provide custom key validation logic for one of the\nbuilt-in backends, you can subclass it, override just the <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_key</span></code>\nmethod, and follow the instructions for <a class=\"reference internal\" href=\"#using-a-custom-cache-backend\">using a custom cache backend</a>. For\ninstance, to do this for the <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code> backend, put this code in a module:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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>...and use the dotted Python path to this class in the\n<a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> portion of your <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting.</p>\n</section>\n</section>\n<section id=\"downstream-caches\">\n<span id=\"id12\"></span><h2>Downstream caches<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>So far, this document has focused on caching your <em>own</em> data. But another type\nof caching is relevant to Web development, too: caching performed by\n&quot;downstream&quot; caches. These are systems that cache pages for users even before\nthe request reaches your website.</p>\n<p>Here are a few examples of downstream caches:</p>\n<ul class=\"simple\">\n<li><p>Your ISP may cache certain pages, so if you requested a page from\n<a class=\"reference external\" href=\"https://example.com/\">https://example.com/</a>, your ISP would send you the page without having to\naccess example.com directly. The maintainers of example.com have no\nknowledge of this caching; the ISP sits between example.com and your Web\nbrowser, handling all of the caching transparently.</p></li>\n<li><p>Your Django website may sit behind a <em>proxy cache</em>, such as Squid Web\nProxy Cache (<a class=\"reference external\" href=\"http://www.squid-cache.org/\">http://www.squid-cache.org/</a>), that caches pages for\nperformance. In this case, each request first would be handled by the\nproxy, and it would be passed to your application only if needed.</p></li>\n<li><p>Your Web browser caches pages, too. If a Web page sends out the\nappropriate headers, your browser will use the local cached copy for\nsubsequent requests to that page, without even contacting the Web page\nagain to see whether it has changed.</p></li>\n</ul>\n<p>Downstream caching is a nice efficiency boost, but there's a danger to it:\nMany Web pages' contents differ based on authentication and a host of other\nvariables, and cache systems that blindly save pages based purely on URLs could\nexpose incorrect or sensitive data to subsequent visitors to those pages.</p>\n<p>For example, if you operate a Web email system, then the contents of the\n&quot;inbox&quot; page depend on which user is logged in. If an ISP blindly cached your\nsite, then the first user who logged in through that ISP would have their\nuser-specific inbox page cached for subsequent visitors to the site.  That's\nnot cool.</p>\n<p>Fortunately, HTTP provides a solution to this problem. A number of HTTP headers\nexist to instruct downstream caches to differ their cache contents depending on\ndesignated variables, and to tell caching mechanisms not to cache particular\npages. We'll look at some of these headers in the sections that follow.</p>\n</section>\n<section id=\"using-vary-headers\">\n<span id=\"id13\"></span><h2>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> headers<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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header defines which request headers a cache\nmechanism should take into account when building its cache key. For example, if\nthe contents of a Web page depend on a user's language preference, the page is\nsaid to &quot;vary on language.&quot;</p>\n<p>By default, Django's cache system creates its cache keys using the requested\nfully-qualified URL -- e.g.,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://www.example.com/stories/2005/?order_by=author&quot;</span></code>. This means every\nrequest to that URL will use the same cached version, regardless of user-agent\ndifferences such as cookies or language preferences. However, if this page\nproduces different content based on some difference in request headers -- such\nas a cookie, or a language, or a user-agent -- you'll need to use the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>\nheader to tell caching mechanisms that the page output depends on those things.</p>\n<p>To do this in Django, use the convenient\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.vary.vary_on_headers\" title=\"django.views.decorators.vary.vary_on_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_headers()</span></code></a> view decorator, like so:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s1\">&#39;User-Agent&#39;</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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>In this case, a caching mechanism (such as Django's own cache middleware) will\ncache a separate version of the page for each unique user-agent.</p>\n<p>The advantage to using the <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> decorator rather than manually\nsetting the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header (using something like\n<code class=\"docutils literal notranslate\"><span class=\"pre\">response['Vary']</span> <span class=\"pre\">=</span> <span class=\"pre\">'user-agent'</span></code>) is that the decorator <em>adds</em> to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header (which may already exist), rather than setting it from scratch\nand potentially overriding anything that was already in there.</p>\n<p>You can pass multiple headers to <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers()</span></code>:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s1\">&#39;User-Agent&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;Cookie&#39;</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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>This tells downstream caches to vary on <em>both</em>, which means each combination of\nuser-agent and cookie will get its own cache value. For example, a request with\nthe user-agent <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> and the cookie value <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=bar</span></code> will be considered\ndifferent from a request with the user-agent <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> and the cookie value\n<code class=\"docutils literal notranslate\"><span class=\"pre\">foo=ham</span></code>.</p>\n<p>Because varying on cookie is so common, there's a\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie\" title=\"django.views.decorators.vary.vary_on_cookie\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_cookie()</span></code></a> decorator. These two views\nare equivalent:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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>\n    <span class=\"o\">...</span>\n\n<span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s1\">&#39;Cookie&#39;</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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>The headers you pass to <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> are not case sensitive;\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;User-Agent&quot;</span></code> is the same thing as <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;user-agent&quot;</span></code>.</p>\n<p>You can also use a helper function, <a class=\"reference internal\" href=\"/ja/3.1/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>,\ndirectly. This function sets, or adds to, the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span> <span class=\"pre\">header</span></code>. For example:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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=\"s1\">&#39;template_name&#39;</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=\"s1\">&#39;Cookie&#39;</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> takes an <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> instance as\nits first argument and a list/tuple of case-insensitive header names as its\nsecond argument.</p>\n<p>For more on Vary headers, see the <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7231.html#section-7.1.4\"><strong>official Vary spec</strong></a>.</p>\n</section>\n<section id=\"controlling-cache-using-other-headers\">\n<h2>Controlling cache: Using other headers<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>Other problems with caching are the privacy of data and the question of where\ndata should be stored in a cascade of caches.</p>\n<p>A user usually faces two kinds of caches: their own browser cache (a private\ncache) and their provider's cache (a public cache). A public cache is used by\nmultiple users and controlled by someone else. This poses problems with\nsensitive data--you don't want, say, your bank account number stored in a\npublic cache. So Web applications need a way to tell caches which data is\nprivate and which is public.</p>\n<p>The solution is to indicate a page's cache should be &quot;private.&quot; To do this in\nDjango, use the <a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> view\ndecorator. Example:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>This decorator takes care of sending out the appropriate HTTP header behind the\nscenes.</p>\n<p>Note that the cache control settings &quot;private&quot; and &quot;public&quot; are mutually\nexclusive. The decorator ensures that the &quot;public&quot; directive is removed if\n&quot;private&quot; should be set (and vice versa). An example use of the two directives\nwould be a blog site that offers both private and public entries. Public\nentries may be cached on any shared cache. The following code uses\n<a class=\"reference internal\" href=\"/ja/3.1/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>, the manual way to modify the\ncache control header (it is internally called by the\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> decorator):</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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>You can control downstream caches in other ways as well (see <span class=\"target\" id=\"index-1\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7234.html\"><strong>RFC 7234</strong></a> for\ndetails on HTTP caching). For example, even if you don't use Django's\nserver-side cache framework, you can still tell clients to cache a view for a\ncertain amount of time with the <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7234.html#section-5.2.2.8\"><strong>max-age</strong></a>\ndirective:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>(If you <em>do</em> use the caching middleware, it already sets the <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> with\nthe value of the <a class=\"reference internal\" href=\"/ja/3.1/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> setting. In that case,\nthe custom <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> from the\n<a class=\"reference internal\" href=\"/ja/3.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> decorator will take\nprecedence, and the header values will be merged correctly.)</p>\n<p>Any valid <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> response directive is valid in <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code>.\nHere are some more examples:</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>The full list of known directives can be found in the <a class=\"reference external\" href=\"https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\">IANA registry</a>\n(note that not all of them apply to responses).</p>\n<p>If you want to use headers to disable caching altogether,\n<a class=\"reference internal\" href=\"/ja/3.1/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> is a view decorator that\nadds headers to ensure the response won't be cached by browsers or other\ncaches. Example:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 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<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>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"order-of-middleware\">\n<h2>Order of <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>If you use caching middleware, it's important to put each half in the right\nplace within the <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> setting. That's because the cache\nmiddleware needs to know which headers by which to vary the cache storage.\nMiddleware always adds something to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> response header when it can.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> runs during the response phase, where middleware is\nrun in reverse order, so an item at the top of the list runs <em>last</em> during the\nresponse phase. Thus, you need to make sure that <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code>\nappears <em>before</em> any other middleware that might add something to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>\nheader. The following middleware modules do so:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> adds <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> adds <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> adds <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>, on the other hand, runs during the request phase,\nwhere middleware is applied first-to-last, so an item at the top of the list\nruns <em>first</em> during the request phase. The <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> also\nneeds to run after other middleware updates the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header, so\n<code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> must be <em>after</em> any item that does so.</p>\n</section>","rootId":"django-s-cache-framework","toc":[{"title":"Setting up the cache","anchor":"setting-up-the-cache","children":[{"title":"Memcached","anchor":"memcached","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":"独自のキャッシュbackendを使う","anchor":"using-a-custom-cache-backend","children":[]},{"title":"キャッシュ引数","anchor":"cache-arguments","children":[]}]},{"title":"The per-site cache","anchor":"the-per-site-cache","children":[]},{"title":"The per-view cache","anchor":"the-per-view-cache","children":[{"title":"Specifying per-view cache in the URLconf","anchor":"specifying-per-view-cache-in-the-urlconf","children":[]}]},{"title":"Template fragment caching","anchor":"template-fragment-caching","children":[]},{"title":"The low-level cache API","anchor":"the-low-level-cache-api","children":[{"title":"Accessing the cache","anchor":"accessing-the-cache","children":[]},{"title":"Basic usage","anchor":"basic-usage","children":[]},{"title":"Cache key prefixing","anchor":"cache-key-prefixing","children":[]},{"title":"Cache versioning","anchor":"cache-versioning","children":[]},{"title":"Cache key transformation","anchor":"cache-key-transformation","children":[]},{"title":"Cache key warnings","anchor":"cache-key-warnings","children":[]}]},{"title":"Downstream caches","anchor":"downstream-caches","children":[]},{"title":"Using Vary headers","anchor":"using-vary-headers","children":[]},{"title":"Controlling cache: Using other headers","anchor":"controlling-cache-using-other-headers","children":[]},{"title":"Order of MIDDLEWARE","anchor":"order-of-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/3.1/topics/"}],"prev":{"docname":"topics/auth/customizing","title":"Django の認証方法のカスタマイズ","url":"/ja/3.1/topics/auth/customizing/"},"next":{"docname":"topics/conditional-view-processing","title":"条件付きビュー","url":"/ja/3.1/topics/conditional-view-processing/"},"formats":{"html":"/ja/3.1/topics/cache/","markdown":"/ja/3.1/topics/cache.md","json":"/ja/3.1/topics/cache.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/cache.txt","official":"https://docs.djangoproject.com/ja/3.1/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","pt-br","ko","es","el","pl"]}