{"title":"O framework de “cache” do Django","version":"3.1","locale":"pt-br","docname":"topics/cache","url":"/pt-br/3.1/topics/cache/","canonical":"https://djangodocs.dev/pt-br/3.1/topics/cache/","summary":"Um dos pontos de perda de equilíbrio em websites dinâmicos, bom, é que eles são dinâmicos. Cada vez que um usuário requisita uma página, o servidor Web faz todo…","html":"<h1>O framework de “cache” do Django<a class=\"heading-anchor\" href=\"#django-s-cache-framework\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Um dos pontos de perda de equilíbrio em websites dinâmicos, bom, é que eles são dinâmicos. Cada vez que um usuário requisita uma página, o servidor Web faz todo tipo de cálculo – de consultas de bancos de dados para renderização de templates à lógica de negócios – para criar páginas que seus visitantes vêem. Visto de uma perspectiva de processamento, isso é muito mais caro, do que uma leitura padrão no sistema de arquivos organizado em um servidor.</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>É aqui que o “cache” entra.</p>\n<p>“Cachear” alguma coisa é guardar o resultado de um cálculo caro para que você não tenha que realziar o cálculo uma próxima vez. Aqui um pseduo-código explicando como isso funcionaria para uma página Web gerada dinamicamente.</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 vem com um sistema de cache robusto que lhe dexa salvar páginas dinâmicas para que não tenham que ser calculadas para cada requisição. Por conveniência, o Django oferece diferentes níveis de granulação do cache: Você pode cachear a saída de uma determinada “view” ,você pode cachear somente os pedaços que estão diciceis de produzir, ou você pode cachear seu site inteiro.</p>\n<p>Django também trabalha bem com caches processados fora do Djanfo, tal como  <a class=\"reference external\" href=\"http://www.squid-cache.org\">Squid</a> e caches baseados em navegadores. Estes são tipo de cache que o desenvolvedor não controla diretamente mas para os quais você pode providenciar dicas (através de cabeçalhos HTTP) sobre quais partes do seu site devem ser cacheadas, e como.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Ver também</p>\n<p>A <a class=\"reference internal\" href=\"/pt-br/3.1/misc/design-philosophies/#cache-design-philosophy\"><span class=\"std std-ref\">A filosofia de construção do frameowrk de cache</span></a> explica um pouco das decisões de desenho do framework.</p>\n</aside>\n<section id=\"setting-up-the-cache\">\n<span id=\"id1\"></span><h2>Definindo o cache.<a class=\"heading-anchor\" href=\"#setting-up-the-cache\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O sistema de cache requer um número pequeno de definições. Listando, você deve dizer onde seus dados de cache devem ficar – se na base de dados, no sistema de arquivos ou diretamente em memória. Essa é uma decisão importante que afeta a performance do seu cache; e sim, alguns tipode de cache são mais rápidos que outros.</p>\n<p>Suas preferências de “cache” vão na definição <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> do seu arquivo de definições. Aqui uma explicação de todos os valores possíveis para o <a class=\"reference internal\" href=\"/pt-br/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 para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O mais rápido, mais eficiente tipo de cache suportado nativamente pelo Django, <a class=\"reference external\" href=\"https://memcached.org/\">Memcached</a> é um servidor de cache totalmente baseado em memória, originalmente desenvolvido para lidar com altas cargas no LiveJournal.com e subsequentemente teve seu código aberto pela Danga Interactive. É usado por sites como Facebook e Wikipedia para reduzir acesso ao banco de dados e melhora a performance do site dramaticamente</p>\n<p>O memcached é executado como um serviço e aloca um montante de RAM. Tudo o que ele faz é adicionar, recuperar e deletar dados no cache. Todo o dado é armazenado diretamente em memória, então não há custo de acesso ao banco de dados ou ao sistema de arquivos.</p>\n<p>Depois de instalar o próprio memcached , você irá precisar instalar o uma lib para acesso ao Memcached. Existem várias bibliotecas Memcached de acesso para Python; as duas mais comuns são  <a class=\"reference external\" href=\"https://pypi.org/project/python-memcached/\">python-memcached</a> e <a class=\"reference external\" href=\"https://pypi.org/project/pylibmc/\">pylibmc</a>.</p>\n<p>Para usar o Memcached com o Django:</p>\n<ul class=\"simple\">\n<li><p>Defina o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> para <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.MemcachedCache</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyLibMCCache</span></code> (dependendo do que você escolheu com biblioteca de acesso ao Memcached)</p></li>\n<li><p>Defina o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> para os valores de <code class=\"docutils literal notranslate\"><span class=\"pre\">ip:port</span></code>, onde <code class=\"docutils literal notranslate\"><span class=\"pre\">ip</span></code> é o endereço IP do serviço do Memcached e <code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code> é a porta na quam o Memcached está rodando, ou para um valor de <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:path</span></code>, onde o <code class=\"docutils literal notranslate\"><span class=\"pre\">path</span></code> é o caminho para o arquivo de Socket Unix do Memcached.</p></li>\n</ul>\n<p>Neste exemplo, o Memcached está rodando no localhost(127.0.0.1) porta 11211, usando a biblioteca de acesso <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</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.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>Neste exemplo, o Memcached está disponível através de um arquivo socket Unix local  <code class=\"file docutils literal notranslate\"><span class=\"pre\">/tmp/memcached.sock</span></code> usando a biblioteca de acesso <code class=\"docutils literal notranslate\"><span class=\"pre\">python-memcached</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.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>Quando usar a biblioteca de acesso <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code>, não inclua o prefixo <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:/</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.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=\"/pt-br/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>Neste exemplo, o cache é compartilhado em instâncias de Memcached rodando nos endereços IP  172.19.26.240 e 172.19.26.242, ambos na porta 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>No exemplo seguinte, o cache está compartilhado nas instâncias de Memcached rodando nos endereços IP 172.19.26.240 (porta 11211), 172.19.26.242 (porta 11212), e 172.19.26.244 (porta 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>Um último ponto sobre o Memcached é que o cache baseado em memória tem desvantagem: como o dado cacheado é armazenado em memória, os dados serão perdidos se seu servidor cair. Claramente, a memória não é feita para armazenar dados de maneira permanente, então não conte com cache baseado em memória como seu único armazenamento de dados. Sem dúvida, <em>nenhum</em> dos “backends” de cache do Django devem ser usados para armazenamento permanente – eles são todos feitos para solução de cache e não armazenamento – mas colocamos isso aqui porque o cache baseado em memória é temporário.</p>\n</section>\n<section id=\"database-caching\">\n<span id=\"id4\"></span><h3>Cache no Banco de Dados<a class=\"heading-anchor\" href=\"#database-caching\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O Django pode armazenar seus dados de cache em um banco de dados. Isso funciona melhor se você tem um servidor de banco de dados rápido e bem indexado.</p>\n<p>Para usar uma tabela de banco de dados como seu “backend” de cache:</p>\n<ul class=\"simple\">\n<li><p>Defina o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> como <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.db.DatabaseCache</span></code></p></li>\n<li><p>Defina o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> indicando o <code class=\"docutils literal notranslate\"><span class=\"pre\">tablename</span></code>, o nome da tabela do banco de dados. Este nome pode ser o que você quiser, com tanto que seja um nome de tabela válido e que não esteja sendo usado em seu banco de dados.</p></li>\n</ul>\n<p>Neste exemplo, o nome da tabela de cache é <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>Criando a tabela de cache<a class=\"heading-anchor\" href=\"#creating-the-cache-table\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Antes de usar o cache no banco de dados, você deve criar a tabela de cache com este comando:</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>Isso cria uma tabela no seu banco de dados que tem o formato correto que o sistema de cache do Django para cache em banco de dados precisa. O nome da tabela é pego da definição de <a class=\"reference internal\" href=\"/pt-br/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>Se estiver usando caches em múltiplos banco de dados, o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> cria uma tabela para cada cache.</p>\n<p>Se estiver usando múltiplas bases de dados, o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> verifica o método <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> dos seus roteadores de banco de dados (veja abaixo).</p>\n<p>Assim como o  <a class=\"reference internal\" href=\"/pt-br/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=\"/pt-br/3.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> não irá tocar nenhuma tabela já existente. Somente criará as tabelas faltantes.</p>\n<p>Para ver o SQL que deve se executado, ao invés de executá-lo, use a opção <a class=\"reference internal\" href=\"/pt-br/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>Múltiplos bancos de dados<a class=\"heading-anchor\" href=\"#multiple-databases\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Se você está usando “cache” no banco de dados com múltiplos bancos de dados, você também precisará definir instruções de roteamento para sua tabela de “cache” no banco de dados. Para propósitos de roteamento, a tabela de “cache” no banco de dados aparece como um modelo chamado <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheEntry</span></code>, em uma aplicação chamada <code class=\"docutils literal notranslate\"><span class=\"pre\">django_cache</span></code>. Este modelo não aparecerá no cache dos modelos, mas o detalhes do modelo podem ser usado para propósitos de roteamento.</p>\n<p>Por exemplo, o roteador a seguir, direciona todas as operações de leitura de cache para <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_replica</span></code>, e todas as operações de escrita para <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code>.  A tabela de cache somente será sincronizada dentro de <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>Se você não especificar direções de rotas para o modelo de cache do banco de dados, o “backend” de cache usará o banco de dados padrão.</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>Cache no sistema de arquivos<a class=\"heading-anchor\" href=\"#filesystem-caching\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>O backend baseado em arquivo serializa e armazena cada valor do cache como um arquivo separado. Para usar este backend defina <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> como <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span></code> e <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span> <span class=\"pre\">&lt;CACHES-LOCATION&gt;`para</span> <span class=\"pre\">o</span> <span class=\"pre\">diretório</span> <span class=\"pre\">adequado.</span> <span class=\"pre\">Por</span> <span class=\"pre\">exemplo,</span> <span class=\"pre\">para</span> <span class=\"pre\">armazenar</span> <span class=\"pre\">dados</span> <span class=\"pre\">de</span> <span class=\"pre\">cache</span> <span class=\"pre\">em</span> <span class=\"pre\">`</span></code>/var/tmp/django_cache``, use esta definição:</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>Se estiver no windows, coloque a letra do disco no começo do caminha, assim:</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>O caminho do diretório deve ser absotluto – quer dizer, ele deve começar na raiz do seu sistema de arquivos. Não importa se você coloca uma barra no final da definição.</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>Cache em memória local<a class=\"heading-anchor\" href=\"#local-memory-caching\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Este é o cache padrão se não houver outro especificado no arquivo de configurações. Se você quer a vantagem de velocidade do cache em memória mas não tem a capacidade de rodar o Memcached, considere o backend para cache em memória local. Este cache é um cache por processo (veja abaixo) e seguro entre “threads”. Para usá-lo, defina <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> com <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span></code>. Por exemplo:</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>O <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> do cache é usado para identificar armazenamentos individuais em memória is. Se você tem somente um cache <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, você pode omitir o <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>; no entanto, se você tiver mais de um cache em memória, você precisa definir um nome para pelo menos um deles de modo a mantê-los separados.</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>Cache fictício (para desenvolvimento)<a class=\"heading-anchor\" href=\"#dummy-caching-for-development\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Finalmente, o Django traz um cache “fictício” que não realiza o cache realmente – somente implementa a interface de cache sem fazer mais nada.</p>\n<p>É útil se você tem um ambiente de produção que faz usa pesado de cache em vários lugares menos em um ambiente de desenvolvimento ou teste onde você não quer o cache e não quer alterar seu código para tal. Para ativar o cache fictício, defina a <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a>  como abaixo:</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>Usando um esquema de cache personalizado<a class=\"heading-anchor\" href=\"#using-a-custom-cache-backend\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Embora o Django já tenha suporte para vários mecanismos de “cache”, as vezes você quer usar um mecanismo personalizado. Para usar um mecanismo de “cache” externo, use o caminho de importação do Python como no <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> da definição do <a class=\"reference internal\" href=\"/pt-br/3.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>, como a seguir:</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>Se você estiver construindo seu próprio mecanismo, você pode usar as implementações padrão de mecanismo de cache como referência. Você achará o código no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">django/core/cache/backends/</span></code> do código fonte do Django.</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>Argumentos do cache<a class=\"heading-anchor\" href=\"#cache-arguments\"><span class=\"visually-hidden\">Link para este cabeçalho</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=\"/pt-br/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=\"/pt-br/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“don’t cache”).</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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=\"/pt-br/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\">Nota</p>\n<p>No, that’s not a typo: the “update” middleware must be first in the list,\nand the “fetch” 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>Então, adicione as seguintes definições obrigatórias ao seu arquivo de definições Django:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/pt-br/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> – O apelido do cache para ser usado para armazenamento.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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> – O número em segundos que cada página deve permanecer cacheada.</p></li>\n<li><p><a class=\"reference internal\" href=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/3.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> – see also\n<a class=\"reference internal\" href=\"/pt-br/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=\"/pt-br/3.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> when\n<a class=\"reference internal\" href=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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 para esta definição</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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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>Aqui é a mesma coisa, com <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> empacotado em <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 para este cabeçalho</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=\"/pt-br/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=\"/pt-br/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 “template_fragments”.\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 para esta definição</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 para este cabeçalho</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 para este cabeçalho</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 para esta definição</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>You can access the caches configured in the <a class=\"reference internal\" href=\"/pt-br/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 para esta definição</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 para este cabeçalho</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 para esta definição</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 para esta definição</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=\"/pt-br/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 para esta definição</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 para esta definição</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 para esta definição</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 para esta definição</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 para esta definição</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 para esta definição</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 para esta definição</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 para esta definição</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=\"/pt-br/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 para esta definição</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 para esta definição</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\">Nota</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 para esta definição</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\">Nota</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 para este cabeçalho</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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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=\"/pt-br/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 para este cabeçalho</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=\"/pt-br/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 para este cabeçalho</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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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“downstream” 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“inbox” 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 para este cabeçalho</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 “vary on language.”</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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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 “private.” To do this in\nDjango, use the <a class=\"reference internal\" href=\"/pt-br/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 “private” and “public” are mutually\nexclusive. The decorator ensures that the “public” directive is removed if\n“private” 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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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=\"/pt-br/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 para este cabeçalho</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=\"/pt-br/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> adiciona <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":"Definindo o cache.","anchor":"setting-up-the-cache","children":[{"title":"Memcached","anchor":"memcached","children":[]},{"title":"Cache no Banco de Dados","anchor":"database-caching","children":[{"title":"Criando a tabela de cache","anchor":"creating-the-cache-table","children":[]},{"title":"Múltiplos bancos de dados","anchor":"multiple-databases","children":[]}]},{"title":"Cache no sistema de arquivos","anchor":"filesystem-caching","children":[]},{"title":"Cache em memória local","anchor":"local-memory-caching","children":[]},{"title":"Cache fictício (para desenvolvimento)","anchor":"dummy-caching-for-development","children":[]},{"title":"Usando um esquema de cache personalizado","anchor":"using-a-custom-cache-backend","children":[]},{"title":"Argumentos do cache","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":"Usando o Django","url":"/pt-br/3.1/topics/"}],"prev":{"docname":"topics/auth/customizing","title":"Personalizando a autenticação no Django","url":"/pt-br/3.1/topics/auth/customizing/"},"next":{"docname":"topics/conditional-view-processing","title":"Conditional View Processing","url":"/pt-br/3.1/topics/conditional-view-processing/"},"formats":{"html":"/pt-br/3.1/topics/cache/","markdown":"/pt-br/3.1/topics/cache.md","json":"/pt-br/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/pt-br/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"]}