{"title":"Djangos ramverk för cache","version":"6.1","locale":"sv","docname":"topics/cache","url":"/sv/6.1/topics/cache/","canonical":"https://djangodocs.dev/sv/6.1/topics/cache/","summary":"En grundläggande avvägning när det gäller dynamiska webbplatser är att de är just dynamiska. Varje gång en användare begär en sida gör webbservern alla möjliga…","html":"<h1>Djangos ramverk för cache<a class=\"heading-anchor\" href=\"#django-s-cache-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>En grundläggande avvägning när det gäller dynamiska webbplatser är att de är just dynamiska. Varje gång en användare begär en sida gör webbservern alla möjliga beräkningar - från databasfrågor till mallåtergivning till affärslogik - för att skapa den sida som besökaren på din webbplats ser. Det här är mycket dyrare, sett ur ett processoverheadperspektiv, än en standardserver som läser en fil från filsystemet.</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\nsmall-to 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>Det är där cachelagring kommer in i bilden.</p>\n<p>Att cachelagra något är att spara resultatet av en dyr beräkning så att du inte behöver utföra beräkningen nästa gång. Här är lite pseudokod som förklarar hur detta skulle fungera för en dynamiskt genererad webbsida:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>given a URL, try finding that page in the cache\nif the page is in the cache:\n    return the cached page\nelse:\n    generate the page\n    save the generated page in the cache (for next time)\n    return the generated page\n</code></pre></div>\n<p>Django levereras med ett robust cachesystem som låter dig spara dynamiska sidor så att de inte behöver beräknas för varje begäran. För enkelhetens skull erbjuder Django olika nivåer av cachegranularitet: Du kan cachelagra resultatet av specifika vyer, du kan cachelagra endast de delar som är svåra att producera, eller du kan cachelagra hela din webbplats.</p>\n<p>Django fungerar också bra med ”nedströms” cacher, till exempel <a class=\"reference external\" href=\"http://www.squid-cache.org/\">Squid</a> och webbläsarbaserade cacher. Det här är de typer av cacheminnen som du inte direkt kontrollerar men som du kan ge ledtrådar (via HTTP-rubriker) om vilka delar av din webbplats som ska cachas och hur.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Se även</p>\n<p>I <a class=\"reference internal\" href=\"/sv/6.1/misc/design-philosophies/#cache-design-philosophy\"><span class=\"std std-ref\">Cache Framework design philosophy</span></a> förklaras några av ramverkets designbeslut.</p>\n</aside>\n<section id=\"setting-up-the-cache\">\n<span id=\"id1\"></span><h2>Uppsättning av cachen<a class=\"heading-anchor\" href=\"#setting-up-the-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Cachesystemet kräver en liten del inställningar. Du måste nämligen tala om var dina cachade data ska finnas - om det är i en databas, på filsystemet eller direkt i minnet. Det här är ett viktigt beslut som påverkar cachens prestanda; ja, vissa cachetyper är snabbare än andra.</p>\n<p>Dina cachepreferenser anges i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> i din inställningsfil. Här följer en förklaring av alla tillgängliga värden för <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>.</p>\n<section id=\"memcached\">\n<span id=\"id2\"></span><h3>Memcached<a class=\"heading-anchor\" href=\"#memcached\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://memcached.org/\">Memcached</a> är en helt minnesbaserad cache-server som ursprungligen utvecklades för att hantera höga belastningar på LiveJournal.com och därefter open-sourcades av Danga Interactive. Den används av webbplatser som Facebook och Wikipedia för att minska databasåtkomsten och dramatiskt öka webbplatsens prestanda.</p>\n<p>Memcached körs som en daemon och tilldelas en viss mängd RAM-minne. Allt den gör är att tillhandahålla ett snabbt gränssnitt för att lägga till, hämta och ta bort data i cacheminnet. All data lagras direkt i minnet, så det finns ingen overhead för databas- eller filsystemanvändning.</p>\n<p>Efter att ha installerat Memcached själv måste du installera en Memcached-bindning. Det finns flera Python Memcached-bindningar tillgängliga; de två som stöds av Django är <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pylibmc/\">pylibmc</a> och <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pymemcache/\">pymemcache</a>.</p>\n<p>Att använda Memcached med Django:</p>\n<ul class=\"simple\">\n<li><p>Ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyMemcacheCache</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyLibMCCache</span></code> (beroende på vilken memcached-bindning du har valt)</p></li>\n<li><p>Ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">ip:port</span></code>-värden, där <code class=\"docutils literal notranslate\"><span class=\"pre\">ip</span></code> är IP-adressen för Memcached-daemon och <code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code> är den port som Memcached körs på, eller till ett <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:path</span></code>-värde, där <code class=\"docutils literal notranslate\"><span class=\"pre\">path</span></code> är sökvägen till en Memcached Unix-socketfil.</p></li>\n</ul>\n<p>I det här exemplet körs Memcached på localhost (127.0.0.1) port 11211, med bindningen <code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>I det här exemplet är Memcached tillgängligt via en lokal Unix-socketfil <code class=\"file docutils literal notranslate\"><span class=\"pre\">/tmp/memcached.sock</span></code> med bindningen <code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;unix:/tmp/memcached.sock&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>En utmärkt funktion hos Memcached är dess förmåga att dela en cache över flera servrar. Det innebär att du kan köra Memcached-daemoner på flera maskiner och programmet kommer att behandla gruppen av maskiner som en <em>enkel</em> cache, utan att behöva duplicera cache-värden på varje maskin. För att dra nytta av den här funktionen måste du inkludera alla serveradresser i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>, antingen som en semikolon- eller kommaseparerad sträng eller som en lista.</p>\n<p>I det här exemplet delas cachen mellan Memcached-instanser som körs på IP-adresserna 172.19.26.240 och 172.19.26.242, båda på port 11211:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;172.19.26.240:11211&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.242:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>I följande exempel delas cacheminnet mellan Memcached-instanser som körs på IP-adresserna 172.19.26.240 (port 11211), 172.19.26.242 (port 11212) och 172.19.26.244 (port 11213):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;172.19.26.240:11211&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.242:11212&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;172.19.26.244:11213&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Som standard ställer backend <code class=\"docutils literal notranslate\"><span class=\"pre\">PyMemcacheCache</span></code> in följande alternativ (du kan åsidosätta dem i din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;allow_unicode_keys&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;default_noreply&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;serde&quot;</span><span class=\"p\">:</span> <span class=\"n\">pymemcache</span><span class=\"o\">.</span><span class=\"n\">serde</span><span class=\"o\">.</span><span class=\"n\">pickle_serde</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>En sista punkt om Memcached är att minnesbaserad cachelagring har en nackdel: eftersom den cachelagrade datan lagras i minnet kommer datan att gå förlorad om din server kraschar. Det är uppenbart att minnet inte är avsett för permanent datalagring, så lita inte på minnesbaserad cachning som din enda datalagring. Utan tvekan bör * ingen * av Djangos cachelagringsbackends användas för permanent lagring - de är alla avsedda att vara lösningar för cachelagring, inte lagring - men vi påpekar detta här eftersom minnesbaserad cachelagring är särskilt tillfällig.</p>\n</section>\n<section id=\"redis\">\n<span id=\"id4\"></span><h3>Redis<a class=\"heading-anchor\" href=\"#redis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://redis.io/\">Redis</a> är en databas i minnet som kan användas för cachelagring. För att börja behöver du en Redis-server som körs antingen lokalt eller på en fjärrmaskin.</p>\n<p>När du har konfigurerat Redis-servern måste du installera Python-bindningar för Redis. <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/redis/\">redis-py</a> är den bindning som stöds naturligt av Django. Installation av paketet <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/hiredis/\">hiredis-py</a> rekommenderas också.</p>\n<p>För att använda Redis som cache-backend med Django:</p>\n<ul class=\"simple\">\n<li><p>Ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.redis.RedisCache</span></code>.</p></li>\n<li><p>Set <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> to the URL pointing to your Redis\ninstance, using the appropriate scheme. See the <code class=\"docutils literal notranslate\"><span class=\"pre\">redis-py</span></code> docs for\n<a class=\"reference external\" href=\"https://redis.readthedocs.io/en/stable/connections.html#redis.connection.ConnectionPool.from_url\">details on the available schemes</a>.</p></li>\n</ul>\n<p>Till exempel, om Redis körs på localhost (127.0.0.1) port 6379:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Ofta är Redis-servrar skyddade med autentisering. För att ange ett användarnamn och lösenord, lägg till dem i <code class=\"docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code> tillsammans med URL:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://username:password@127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Om du har konfigurerat flera Redis-servrar i replikationsläget kan du ange servrarna antingen som en semikolon- eller kommaseparerad sträng eller som en lista. När du använder flera servrar utförs skrivoperationer på den första servern (leader). Läsoperationer utförs på de andra servrarna (replikerna) som väljs slumpmässigt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># leader</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6378&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># read-replica 1</span>\n            <span class=\"s2\">&quot;redis://127.0.0.1:6377&quot;</span><span class=\"p\">,</span>  <span class=\"c1\"># read-replica 2</span>\n        <span class=\"p\">],</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"database-caching\">\n<span id=\"id6\"></span><h3>Cachelagring av databas<a class=\"heading-anchor\" href=\"#database-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django kan lagra sina cachade data i din databas. Detta fungerar bäst om du har en snabb, välindexerad databasserver.</p>\n<p>För att använda en databastabell som cache-backend:</p>\n<ul class=\"simple\">\n<li><p>Ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.db.DatabaseCache</span></code></p></li>\n<li><p>Ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">tablename</span></code>, namnet på databastabellen. Detta namn kan vara vad du vill, så länge det är ett giltigt tabellnamn som inte redan används i din databas.</p></li>\n</ul>\n<p>I det här exemplet är cachetabellens namn <code class=\"docutils literal notranslate\"><span class=\"pre\">my_cache_table</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.db.DatabaseCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_cache_table&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Unlike other cache backends, the database cache does not support automatic\nculling of expired entries at the database level. Instead, an expired cache\nentry is deleted when evaluated by a <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> request. Furthermore,\nexpired cache entries are culled when <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code>, or <code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code>\nis called and the number of entries exceeds <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code>.</p>\n<section id=\"creating-the-cache-table\">\n<span id=\"database-caching-creating-the-table\"></span><h4>Skapa cache-tabellen<a class=\"heading-anchor\" href=\"#creating-the-cache-table\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Innan du använder databascachen måste du skapa cachetabellen med det här kommandot:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>createcachetable\n</code></pre></div>\n<p>Detta skapar en tabell i din databas som är i det korrekta format som Djangos databas-cache-system förväntar sig. Namnet på tabellen hämtas från <a class=\"reference internal\" href=\"/sv/6.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>Om du använder flera databascacher skapar <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> en tabell för varje cache.</p>\n<p>Om du använder flera databaser följer <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> i dina databasroutrar (se nedan).</p>\n<p>Precis som <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> kommer <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> inte att röra en befintlig tabell. Den kommer bara att skapa tabeller som saknas.</p>\n<p>Om du vill skriva ut den SQL som ska köras, i stället för att köra den, använder du alternativet <a class=\"reference internal\" href=\"/sv/6.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<span id=\"database-caching-multiple-databases\"></span><h4>Flera databaser<a class=\"heading-anchor\" href=\"#multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Om du använder databascache med flera databaser måste du också ställa in routningsinstruktioner för din databascachetabell. När det gäller routing visas databasens cachetabell som en modell med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheEntry</span></code>, i en applikation med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">django_cache</span></code>. Denna modell kommer inte att visas i modellcachen, men modellinformationen kan användas för routingändamål.</p>\n<p>Följande router skulle till exempel styra alla läsoperationer i cachen till <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_replica</span></code> och alla skrivoperationer till <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code>. Cachetabellen kommer endast att synkroniseras till <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CacheRouter</span><span class=\"p\">:</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;A router to control all database cache operations&quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;All cache read operations go to the replica&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;cache_replica&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;All cache write operations go to primary&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;cache_primary&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">db</span><span class=\"p\">,</span> <span class=\"n\">app_label</span><span class=\"p\">,</span> <span class=\"n\">model_name</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">hints</span><span class=\"p\">):</span>\n        <span class=\"s2\">&quot;Only install the cache model on primary&quot;</span>\n        <span class=\"k\">if</span> <span class=\"n\">app_label</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;django_cache&quot;</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"n\">db</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;cache_primary&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>Om du inte anger några routningsanvisningar för databasens cachemodell kommer cache-backend att använda standarddatabasen.</p>\n<p>Och om du inte använder databascache-backend behöver du inte oroa dig för att tillhandahålla routningsinstruktioner för databascachemodellen.</p>\n</section>\n</section>\n<section id=\"filesystem-caching\">\n<span id=\"id7\"></span><h3>Cachelagring i filsystem<a class=\"heading-anchor\" href=\"#filesystem-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Den filbaserade backend serialiserar och lagrar varje cache-värde som en separat fil. För att använda denna backend, sätt <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span></code> och <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> till en lämplig katalog. Till exempel, för att lagra cachad data i <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code>, använd denna inställning:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/var/tmp/django_cache&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Om du använder Windows sätter du enhetsbeteckningen i början av sökvägen, så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;c:/foo/bar&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Katalogsökvägen ska vara absolut, dvs. den ska börja vid roten av filsystemet. Det spelar ingen roll om du lägger till ett snedstreck i slutet av inställningen.</p>\n<p>Se till att katalogen som den här inställningen pekar på antingen finns och är läsbar och skrivbar, eller att den kan skapas av systemanvändaren som din webbserver körs under. Om du fortsätter med exemplet ovan och din server körs som användaren <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code> måste du se till att katalogen <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code> finns och är läsbar och skrivbar av användaren <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>, eller att den kan skapas av användaren <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>När cacheminnet <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> ingår i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a>, <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_ROOT</span></code></a> eller <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATICFILES_FINDERS</span></code></a> kan känsliga data exponeras.</p>\n<p>En angripare som får tillgång till cachefilen kan inte bara förfalska HTML-innehåll, som din webbplats kommer att lita på, utan också fjärrköra godtycklig kod, eftersom data serialiseras med <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">pickle</span></code></a>.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Filsystemets cachelagring kan bli långsam när ett stort antal filer lagras. Om du stöter på detta problem bör du överväga att använda en annan cachemekanism. Du kan också underklassa <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/core/cache/backends/filebased.py\">FileBasedCache</a> och förbättra gallringsstrategin.</p>\n</aside>\n</section>\n<section id=\"local-memory-caching\">\n<span id=\"id8\"></span><h3>Cachelagring i lokalt minne<a class=\"heading-anchor\" href=\"#local-memory-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Detta är standardcachen om ingen annan anges i din inställningsfil. Om du vill ha hastighetsfördelarna med cachning i minnet men inte har möjlighet att köra Memcached kan du överväga backend för cache i lokalt minne. Denna cache är per-process (se nedan) och trådsäker. För att använda den, ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span></code>. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;unique-snowflake&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Cacheminnet <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> används för att identifiera enskilda minneslagringar. Om du bara har en <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>-cache kan du utelämna <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>; men om du har mer än en lokal minnescache måste du tilldela ett namn till minst en av dem för att hålla dem åtskilda.</p>\n<p>Cachen använder en LRU-strategi (least-recently-used) för gallring.</p>\n<p>Observera att varje process kommer att ha sin egen privata cache-instans, vilket innebär att ingen cachelagring över processgränserna är möjlig. Detta innebär också att den lokala minnescachen inte är särskilt minneseffektiv, så det är förmodligen inte ett bra val för produktionsmiljöer. Det är trevligt för utveckling.</p>\n</section>\n<section id=\"dummy-caching-for-development\">\n<span id=\"dummy-caching\"></span><h3>Dummy-cachelagring (för utveckling)<a class=\"heading-anchor\" href=\"#dummy-caching-for-development\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Slutligen levereras Django med en ”dummy”-cache som faktiskt inte cachelagrar - den implementerar bara cache-gränssnittet utan att göra någonting.</p>\n<p>Detta är användbart om du har en produktionswebbplats som använder kraftig cachelagring på olika ställen men en utvecklings-/testmiljö där du inte vill cachelagra och inte vill behöva ändra din kod för att specialanpassa det senare. För att aktivera dummy-caching, ställ in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.dummy.DummyCache&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"using-a-custom-cache-backend\">\n<span id=\"id9\"></span><h3>Använda en anpassad cache-backend<a class=\"heading-anchor\" href=\"#using-a-custom-cache-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Även om Django inkluderar stöd för ett antal cache-backends direkt, kanske du ibland vill använda en anpassad cache-backend. För att använda en extern cache-backend med Django, använd Python-importsökvägen som <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>-inställningen, så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;path.to.backend&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Om du bygger din egen backend kan du använda standardcache-backends som referensimplementeringar. Du hittar koden i katalogen <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.1.x/django/core/cache/backends/\">django/core/cache/backends/</a> i Django-källan.</p>\n<p>Obs: Utan en riktigt tvingande anledning, till exempel en värd som inte stöder dem, bör du hålla dig till de cache-backends som ingår i Django. De har testats väl och är väldokumenterade.</p>\n</section>\n<section id=\"cache-arguments\">\n<span id=\"id10\"></span><h3>Cache-argument<a class=\"heading-anchor\" href=\"#cache-arguments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Varje cache-backend kan ges ytterligare argument för att styra cachningens beteende. Dessa argument anges som ytterligare nycklar i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>. Giltiga argument är följande:</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code></a>: Standardtimeout i sekunder som ska användas för cacheminnet. Standardvärdet för detta argument är <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code> sekunder (5 minuter). Du kan ställa in <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> så att cache-nycklarna som standard aldrig går ut. Ett värde på <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> gör att nycklar omedelbart upphör att gälla (i praktiken ”cachas inte”).</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>: Alla alternativ som ska skickas till cache-backend. Listan över giltiga alternativ varierar med varje backend, och cache-backends som backas upp av ett tredjepartsbibliotek skickar sina alternativ direkt till det underliggande cachebiblioteket.</p>\n<p>Cache-backends som implementerar sin egen gallringsstrategi (dvs. backends för <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filsystem</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">databas</span></code>) kommer att respektera följande alternativ:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code>: Det maximala antalet poster som tillåts i cacheminnet innan gamla värden raderas. Standardvärdet för detta argument är <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>: Den andel av posterna som gallras när <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> har uppnåtts. Det faktiska förhållandet är <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span> <span class=\"pre\">/</span> <span class=\"pre\">CULL_FREQUENCY</span></code>, så sätt <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> för att gallra hälften av posterna när <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> nås. Detta argument bör vara ett heltal och standardvärdet är <code class=\"docutils literal notranslate\"><span class=\"pre\">3</span></code>.</p>\n<p>Ett värde på <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> för <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> innebär att hela cachen kommer att dumpas när <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> nås. På vissa backends (i synnerhet <code class=\"docutils literal notranslate\"><span class=\"pre\">databasen</span></code>) gör detta utrensningen <em>mycket</em> snabbare på bekostnad av fler cachemissar.</p>\n</li>\n</ul>\n<p>Backends för Memcached och Redis skickar innehållet i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> som nyckelordsargument till klientkonstruktörerna, vilket möjliggör mer avancerad kontroll av klientbeteendet. För exempel på användning, se nedan.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.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>: En sträng som automatiskt kommer att inkluderas (prepended som standard) till alla cache-nycklar som används av Django-servern.</p>\n<p>Se <a class=\"reference internal\" href=\"#cache-key-prefixing\"><span class=\"std std-ref\">cache-dokumentationen</span></a> för mer information.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>: Standardversionsnummer för cache-nycklar som genereras av Django-servern.</p>\n<p>Se <a class=\"reference internal\" href=\"#cache-versioning\"><span class=\"std std-ref\">cache-dokumentationen</span></a> för mer information.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.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> En sträng som innehåller en prickad sökväg till en funktion som definierar hur ett prefix, en version och en nyckel ska sättas samman till en slutlig cache-nyckel.</p>\n<p>Se <a class=\"reference internal\" href=\"#cache-key-transformation\"><span class=\"std std-ref\">cache-dokumentationen</span></a> för mer information.</p>\n</li>\n</ul>\n<p>I det här exemplet konfigureras en backend för ett filsystem med en timeout på 60 sekunder och en maximal kapacitet på 1000 objekt:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/var/tmp/django_cache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;TIMEOUT&quot;</span><span class=\"p\">:</span> <span class=\"mi\">60</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span><span class=\"s2\">&quot;MAX_ENTRIES&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1000</span><span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Här följer ett exempel på konfiguration för en <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code>-baserad backend som aktiverar det binära protokollet, SASL-autentisering och beteendeläget <code class=\"docutils literal notranslate\"><span class=\"pre\">ketama</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyLibMCCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;binary&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;username&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;user&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;password&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;pass&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;behaviors&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;ketama&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"p\">},</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Här är ett exempel på konfiguration för en <code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</span></code>-baserad backend som aktiverar klientpoolning (vilket kan förbättra prestanda genom att hålla klienter anslutna), behandlar memcache/nätverksfel som cachemissar och ställer in flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">TCP_NODELAY</span></code> på anslutningens socket:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.memcached.PyMemcacheCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;127.0.0.1:11211&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;no_delay&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;ignore_exc&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;max_pool_size&quot;</span><span class=\"p\">:</span> <span class=\"mi\">4</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;use_pooling&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Här är ett exempel på konfiguration för en <code class=\"docutils literal notranslate\"><span class=\"pre\">redis</span></code>-baserad backend som väljer databas <code class=\"docutils literal notranslate\"><span class=\"pre\">10</span></code> (som standard levereras Redis med 16 logiska databaser) och anger en anpassad <a class=\"reference external\" href=\"https://github.com/redis/redis-py#connection-pools\">connection pool class</a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">redis.ConnectionPool</span></code> används som standard):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">CACHES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.cache.backends.redis.RedisCache&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;LOCATION&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis://127.0.0.1:6379&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;db&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;10&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;pool_class&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;redis.BlockingConnectionPool&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"the-per-site-cache\">\n<span id=\"id11\"></span><h2>Cache för varje webbplats<a class=\"heading-anchor\" href=\"#the-per-site-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>När cachen är konfigurerad är det enklaste sättet att använda cachelagring att cachelagra hela din webbplats. Du måste lägga till <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.UpdateCacheMiddleware'</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.FetchFromCacheMiddleware'</span></code> till din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>-inställning, som i det här exemplet:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.middleware.cache.UpdateCacheMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.common.CommonMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.cache.FetchFromCacheMiddleware&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Nej, det är inte ett skrivfel: ”update”-medievaran måste vara först i listan och ”fetch”-medievaran måste vara sist. Detaljerna är lite otydliga, men se <a class=\"reference internal\" href=\"#order-of-middleware\">Order of MIDDLEWARE</a> nedan om du vill ha hela historien.</p>\n</aside>\n<p>Lägg sedan till följande nödvändiga inställningar i din Django-inställningsfil:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/6.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> – Det cache-alias som ska användas för lagring.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.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> – Heltal antal sekunder som varje sida ska cachas.</p></li>\n<li><p><a class=\"reference internal\" href=\"/sv/6.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> – Om cacheminnet delas mellan flera webbplatser som använder samma Django-installation, sätt detta till namnet på webbplatsen eller någon annan sträng som är unik för denna Django-instans, för att förhindra nyckelkollisioner. Använd en tom sträng om du inte bryr dig.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> cachelagrar GET- och HEAD-svar med status 200, där begäran och svarshuvudena tillåter det. Svar på förfrågningar om samma URL med olika frågeparametrar betraktas som unika sidor och cachelagras separat. Detta middleware förväntar sig att en HEAD-begäran besvaras med samma svarsrubriker som motsvarande GET-begäran; i så fall kan det returnera ett cachelagrat GET-svar för HEAD-begäran.</p>\n<p>Dessutom ställer <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> automatiskt in några rubriker i varje <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse`</span></code> som påverkar <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">downstream cacher</span></a>:</p>\n<ul class=\"simple\">\n<li><p>Ställer in rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> till aktuellt datum/tid plus den definierade <a class=\"reference internal\" href=\"/sv/6.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>Ställer in <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code>-rubriken för att ge en maxålder för sidan – återigen från <a class=\"reference internal\" href=\"/sv/6.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>-inställningen.</p></li>\n</ul>\n<p>Se <a class=\"reference internal\" href=\"/sv/6.1/topics/http/middleware/\"><span class=\"doc\">Middleware</span></a> för mer information om middleware.</p>\n<p>Om en vy ställer in sin egen utgångstid för cachen (dvs. den har en <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code>-sektion i sin <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code>-rubrik) kommer sidan att cachelagras fram till utgångstiden, i stället för att <a class=\"reference internal\" href=\"/sv/6.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>. Med hjälp av dekoratorerna i <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> kan du enkelt ställa in en vys utgångstid (med hjälp av dekoratorn <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>) eller inaktivera cachning för en vy (med hjälp av dekoratorn <a class=\"reference internal\" href=\"/sv/6.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>). Se avsnittet <a class=\"reference internal\" href=\"#controlling-cache-using-other-headers\">Använda andra rubriker</a> för mer information om dessa dekoratorer.</p>\n<p id=\"i18n-cache-key\">If <a class=\"reference internal\" href=\"/sv/6.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=\"/sv/6.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> (see also\n<a class=\"reference internal\" href=\"/sv/6.1/topics/i18n/translation/#how-django-discovers-language-preference\"><span class=\"std std-ref\">Hur Django upptäcker språkpreferenser</span></a>). This allows you to easily\ncache multilingual sites without having to create the cache key yourself.</p>\n<p>Cache-nycklar inkluderar även <a class=\"reference internal\" href=\"/sv/6.1/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">aktuell tidszon</span></a> när <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> är satt till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</section>\n<section id=\"the-per-view-cache\">\n<h2>Cache för varje visning<a class=\"heading-anchor\" href=\"#the-per-view-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.decorators.cache.cache_page\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.views.decorators.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cache_page</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">cache</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key_prefix</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.decorators.cache.cache_page\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Ett mer detaljerat sätt att använda cachelagringsramverket är genom att cachelagra utdata från enskilda vyer. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> definierar en <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> dekorator som automatiskt kommer att cacha vyns svar åt dig:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n\n\n<span class=\"nd\">@cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> tar ett enda argument: cachens timeout, i sekunder. I exemplet ovan kommer resultatet av vyn <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view()</span></code> att cachas i 15 minuter. (Observera att vi har skrivit det som <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> för läsbarhetens skull. <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> kommer att utvärderas till <code class=\"docutils literal notranslate\"><span class=\"pre\">900</span></code> - det vill säga 15 minuter multiplicerat med 60 sekunder per minut)</p>\n<p>Den timeout för cachen som ställs in av <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> har företräde framför <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code>-direktivet från <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code>-headern.</p>\n<p>Cachen per vy är, precis som cachen per webbplats, kopplad till webbadressen. Om flera webbadresser pekar på samma vy kommer varje webbadress att cachas separat. Om vi fortsätter med exemplet <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code>, om din URLconf ser ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">my_view</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>så kommer förfrågningar till <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/1/</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code> att cachelagras separat, som du kanske förväntar dig. Men när en viss URL (t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code>) har begärts, kommer efterföljande begäranden till den URL:en att använda cacheminnet.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> kan också ta ett valfritt nyckelordsargument, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>, som instruerar dekoratorn att använda en specifik cache (från din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>-inställning) när du cachar vyresultat. Som standard kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>-cachen att användas, men du kan ange vilken cache du vill:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">,</span> <span class=\"n\">cache</span><span class=\"o\">=</span><span class=\"s2\">&quot;special_cache&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>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=\"/sv/6.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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Argumenten <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> kan anges tillsammans. Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> och <a class=\"reference internal\" href=\"/sv/6.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> som anges under <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> kommer att sammanfogas.</p>\n<p>Dessutom ställer <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> automatiskt in <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> rubriker i svaret som påverkar <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">downstream caches</span></a>.</p>\n<aside class=\"admonition-responses-are-cached-before-response-middleware-runs admonition\">\n<p class=\"admonition-title\">Responses are cached before response middleware runs</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> is intended for content that is safe to reuse for requests\nto the same URL. It does not automatically vary by authentication,\nsessions, cookies, or other request-specific state.</p>\n<p>As a decorator wrapping the view directly, responses are cached before\nresponse middleware runs. If cache variation depends on response\nmiddleware, ensure it runs before the response is cached. For example, when\ncaching views containing CSRF-protected forms, follow\n<a class=\"reference internal\" href=\"/sv/6.1/howto/csrf/#csrf-cache-page\"><span class=\"std std-ref\">Använda CSRF-skydd med cachelagring</span></a> to ensure the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header is set first.</p>\n</aside>\n<section id=\"specifying-per-view-cache-in-the-urlconf\">\n<h3>Ange cache per vy i URLconf<a class=\"heading-anchor\" href=\"#specifying-per-view-cache-in-the-urlconf\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The examples in the previous section have hardcoded 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\nfunctions themselves.</p>\n<p>Du kan göra det genom att linda in vyfunktionen med <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> när du hänvisar till den i URLconf. Här är den gamla URLconf från tidigare:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">my_view</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Här är samma sak, med <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> inlindad i <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;foo/&lt;int:code&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">cache_page</span><span class=\"p\">(</span><span class=\"mi\">60</span> <span class=\"o\">*</span> <span class=\"mi\">15</span><span class=\"p\">)(</span><span class=\"n\">my_view</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"template-fragment-caching\">\n<span id=\"std-templatetag-cache\"></span><h2>Cachelagring av mallfragment<a class=\"heading-anchor\" href=\"#template-fragment-caching\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Om du vill ha ännu mer kontroll kan du också cacha mallfragment med hjälp av malltaggen <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>. För att ge din mall tillgång till denna tagg, lägg <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> nära toppen av din mall.</p>\n<p>Malltaggen <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> cachar innehållet i blocket under en viss tid. Den tar minst två argument: cache timeout, i sekunder, och det namn som ska ges till cachefragmentet. Fragmentet cachelagras för evigt om timeout är <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Namnet kommer att tas som det är, använd inte en variabel. Till exempel:</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\na separate cached copy of the sidebar used in the previous example for every\nuser of your site. Do this by passing one or more additional arguments, which\nmay be variables 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\nthat will uniquely identify the cache fragment when those values are converted\nto strings:</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<aside class=\"admonition-argument-values-converted-to-strings admonition\">\n<p class=\"admonition-title\">Argument values converted to strings</p>\n<p>Because argument values are converted to strings when creating the cache\nkey, consider uniqueness carefully to avoid serving one fragment for two\ndistinct values that share a string representation, such as <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;None&quot;</span></code>. Avoid supplying a model instance, since its <code class=\"docutils literal notranslate\"><span class=\"pre\">__str__()</span></code> is\nnot guaranteed to be unique. Conveniently, in the example above,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">request.user.username</span></code> is unique for the default <code class=\"docutils literal notranslate\"><span class=\"pre\">User</span></code> model.</p>\n</aside>\n<p>Om <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> är inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer den webbplatsspecifika middleware-cachen att <a class=\"reference internal\" href=\"#i18n-cache-key\"><span class=\"std std-ref\">respektera det aktiva språket</span></a>. För malltaggen <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> kan du använda en av de <a class=\"reference internal\" href=\"/sv/6.1/topics/i18n/translation/#template-translation-vars\"><span class=\"std std-ref\">översättningsspecifika variabler</span></a> som finns i mallar för att uppnå samma resultat:</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>Cachens timeout kan vara en mallvariabel, så länge mallvariabeln motsvarar ett heltal. Om mallvariabeln <code class=\"docutils literal notranslate\"><span class=\"pre\">my_timeout</span></code> till exempel är inställd på värdet <code class=\"docutils literal notranslate\"><span class=\"pre\">600</span></code>, är följande två exempel likvärdiga:</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>Den här funktionen är användbar för att undvika upprepningar i mallar. Du kan ställa in timeouten i en variabel på ett ställe och återanvända det värdet.</p>\n<p>Som standard kommer cache-taggen att försöka använda den cache som heter ”template_fragments”. Om ingen sådan cache finns kommer den att återgå till att använda standardcachen. Du kan välja en alternativ cache-backend att använda med nyckelordsargumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code>, som måste vara det sista argumentet till taggen.</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>Det betraktas som ett fel att ange ett cacheminnesnamn som inte är konfigurerat.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.utils.make_template_fragment_key\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.utils.</span></span><span class=\"sig-name descname\"><span class=\"pre\">make_template_fragment_key</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fragment_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">vary_on</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.utils.make_template_fragment_key\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>If you want to obtain the cache key used for a cached fragment, you can use\n<code class=\"docutils literal notranslate\"><span class=\"pre\">make_template_fragment_key</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">fragment_name</span></code> is the same as the second\nargument to 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\narguments passed to the tag. This function can be useful for invalidating or\noverwriting a 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=\"s2\">&quot;sidebar&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">username</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"p\">)</span>  <span class=\"c1\"># invalidates cached template fragment</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"the-low-level-cache-api\">\n<span id=\"low-level-cache-api\"></span><h2>API för cache på låg nivå<a class=\"heading-anchor\" href=\"#the-low-level-cache-api\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ibland tjänar man inte mycket på att cacha en hel renderad sida och det är i själva verket en obekväm överdrift.</p>\n<p>Kanske innehåller din webbplats till exempel en vy vars resultat beror på flera dyra frågor, vars resultat ändras med olika intervall. I det här fallet skulle det inte vara idealiskt att använda den helsidescachelagring som cache-strategierna per webbplats eller per vy erbjuder, eftersom du inte skulle vilja cacha hela resultatet (eftersom vissa data ändras ofta), men du skulle fortfarande vilja cacha de resultat som sällan ändras.</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 <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">Python</span> <span class=\"pre\">documentation</span></code></a> for more information\nabout pickling.)</p>\n<section id=\"accessing-the-cache\">\n<h3>Tillgång till cachen<a class=\"heading-anchor\" href=\"#accessing-the-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.caches\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">caches</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.caches\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Du kan komma åt de cacher som konfigurerats i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> genom ett diktliknande objekt: <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.caches</span></code>. Upprepade förfrågningar om samma alias i samma tråd kommer att returnera samma objekt.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">caches</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache1</span> <span class=\"o\">=</span> <span class=\"n\">caches</span><span class=\"p\">[</span><span class=\"s2\">&quot;myalias&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache2</span> <span class=\"o\">=</span> <span class=\"n\">caches</span><span class=\"p\">[</span><span class=\"s2\">&quot;myalias&quot;</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache1</span> <span class=\"ow\">is</span> <span class=\"n\">cache2</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Om den angivna nyckeln inte finns kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">InvalidCacheBackendError</span></code> att uppstå.</p>\n<p>För att ge trådsäkerhet kommer en annan instans av cache-backend att returneras för varje tråd.</p>\n</dd></dl>\n\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cache</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.cache\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Som en genväg finns standardcachen tillgänglig som <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.cache</span></code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache</span>\n</code></pre></div>\n<p>Detta objekt är likvärdigt med <code class=\"docutils literal notranslate\"><span class=\"pre\">caches['default']</span></code>.</p>\n</dd></dl>\n\n</section>\n<section id=\"basic-usage\">\n<span id=\"cache-basic-interface\"></span><h3>Grundläggande användning<a class=\"heading-anchor\" href=\"#basic-usage\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det grundläggande gränssnittet är:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.set\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">set</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hello, world!&quot;</span><span class=\"p\">,</span> <span class=\"mi\">30</span><span class=\"p\">)</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello, world!&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> bör vara en <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> kan vara vilket Python-objekt som helst.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> är valfritt och standardvärdet är argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> för lämplig backend i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> (förklaras ovan). Det är antalet sekunder som värdet ska lagras i cacheminnet. Om du anger <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> för <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> kommer värdet att cachas för alltid. En <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> på <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> kommer inte att cachelagra värdet.</p>\n<p>Om objektet inte finns i cacheminnet returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Wait 30 seconds for &#39;my_key&#39; to expire...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n</code></pre></div>\n<p>Om du behöver avgöra om objektet finns i cacheminnet och du har lagrat ett bokstavligt värde <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, använd ett sentinel-objekt som standard:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sentinel</span> <span class=\"o\">=</span> <span class=\"nb\">object</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">sentinel</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"n\">sentinel</span>\n<span class=\"go\">False</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Wait 30 seconds for &#39;my_key&#39; to expire...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">sentinel</span><span class=\"p\">)</span> <span class=\"ow\">is</span> <span class=\"n\">sentinel</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> kan ta ett <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> argument. Detta anger vilket värde som ska returneras om objektet inte finns i cacheminnet:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;has expired&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;has expired&#39;</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.add\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.add\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du vill lägga till en nyckel bara om den inte redan finns använder du metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>. Den tar samma parametrar som <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code>, men den kommer inte att försöka uppdatera cachen om den angivna nyckeln redan finns:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Initial value&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;New value&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;add_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;Initial value&#39;</span>\n</code></pre></div>\n<p>Om du behöver veta om <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> har lagrat ett värde i cacheminnet kan du kontrollera returvärdet. Det kommer att returnera <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> om värdet lagrades, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> annars.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get_or_set\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_or_set</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">default</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get_or_set\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du vill hämta en nyckels värde eller ange ett värde om nyckeln inte finns i cacheminnet finns metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_set()</span></code>. Den tar samma parametrar som <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code> men standardvärdet sätts som det nya cachervärdet för den nyckeln, istället för att returneras:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_new_key&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># returns None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_or_set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_new_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my new value&quot;</span><span class=\"p\">,</span> <span class=\"mi\">100</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;my new value&#39;</span>\n</code></pre></div>\n<p>Du kan också skicka vilken callable som helst som ett <em>standardvärde</em>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_or_set</span><span class=\"p\">(</span><span class=\"s2\">&quot;some-timestamp-key&quot;</span><span class=\"p\">,</span> <span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">datetime</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">)</span>\n<span class=\"go\">datetime.datetime(2014, 12, 11, 0, 15, 49, 457920)</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.get_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keys</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.get_many\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Det finns också ett <code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code>-gränssnitt som bara träffar cacheminnet en gång. <code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> returnerar en ordbok med alla nycklar du bad om som faktiskt finns i cachen (och som inte har gått ut):</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;c&quot;</span><span class=\"p\">,</span> <span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">{&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.set_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">set_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">dict</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.set_many\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du vill ange flera värden mer effektivt kan du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> för att skicka en ordbok med nyckel-värdepar:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set_many</span><span class=\"p\">({</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">:</span> <span class=\"mi\">3</span><span class=\"p\">})</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">{&#39;a&#39;: 1, &#39;b&#39;: 2, &#39;c&#39;: 3}</span>\n</code></pre></div>\n<p>Liksom <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.set()</span></code> har <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> en valfri parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code>.</p>\n<p>På backends som stöds (memcached) returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> en lista över nycklar som inte kunde infogas.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.delete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.delete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Du kan ta bort nycklar explicit med <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> för att rensa cacheminnet för ett visst objekt:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> om nyckeln har raderats framgångsrikt, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> annars.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.delete_many\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">delete_many</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keys</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.delete_many\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Om du vill rensa en massa nycklar på en gång kan <code class=\"docutils literal notranslate\"><span class=\"pre\">delete_many()</span></code> ta emot en lista med nycklar som ska rensas:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">delete_many</span><span class=\"p\">([</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;b&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;c&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.clear\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">clear</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.clear\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>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=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">clear</span><span class=\"p\">()</span>\n</code></pre></div>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.touch\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">touch</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timeout</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">DEFAULT_TIMEOUT</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.touch\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache.touch()</span></code> anger en ny utgångsdatum för en nyckel. Till exempel, för att uppdatera en nyckel så att den upphör att gälla om 10 sekunder:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">touch</span><span class=\"p\">(</span><span class=\"s2\">&quot;a&quot;</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Precis som för andra metoder är argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> valfritt och standardvärdet är alternativet <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> för lämplig backend i inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> om nyckeln berördes framgångsrikt, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> annars.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.incr\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">incr</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">delta</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.incr\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.decr\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">decr</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">key</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">delta</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">version</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.decr\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Du kan också öka eller minska en nyckel som redan finns med hjälp av metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">incr()</span></code> respektive <code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code>. Som standard kommer det befintliga cache-värdet att ökas eller minskas med 1. Andra öknings-/dekrementeringsvärden kan anges genom att tillhandahålla ett argument till increment/decrement-anropet. Ett ValueError kommer att uppstå om du försöker öka eller minska en icke-existerande cache-nyckel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">2</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">10</span><span class=\"p\">)</span>\n<span class=\"go\">12</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">decr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">11</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">decr</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">5</span><span class=\"p\">)</span>\n<span class=\"go\">6</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">incr()</span></code>/decr()` garanteras inte att vara atomiska. På de backends som stödjer atomär inkrementering/dekrementering (framför allt memcached-backend) kommer inkrementerings- och dekrementeringsoperationer att vara atomära. Men om backend inte naturligt tillhandahåller en inkrementerings-/dekrementeringsoperation kommer den att implementeras med hjälp av en tvåstegshämtning/uppdatering.</p>\n</aside>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache.close\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">close</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.cache.cache.close\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Du kan stänga anslutningen till din cache med <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> om det implementeras av cache-backend.</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>För cacher som inte implementerar <code class=\"docutils literal notranslate\"><span class=\"pre\">close</span></code>-metoder är det ett no-op.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>De asynkrona varianterna av basmetoderna har prefixet <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>, t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.aadd()</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.adelete_many()</span></code>. Se <a class=\"reference internal\" href=\"#id16\">Asynkront stöd</a> för mer information.</p>\n</aside>\n</section>\n<section id=\"cache-key-prefixing\">\n<span id=\"id13\"></span><h3>Prefixering av nyckel i cacheminnet<a class=\"heading-anchor\" href=\"#cache-key-prefixing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du delar en cache-instans mellan olika servrar, eller mellan produktions- och utvecklingsmiljöerna, är det möjligt att data som har cachats av en server används av en annan server. Om formatet för cachade data skiljer sig åt mellan servrarna kan det leda till problem som är mycket svåra att diagnostisera.</p>\n<p>För att förhindra detta ger Django möjlighet att prefixa alla cache-nycklar som används av en server. När en viss cache-nyckel sparas eller hämtas kommer Django automatiskt att prefixa cache-nyckeln med värdet av cache-inställningen <a class=\"reference internal\" href=\"/sv/6.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>.</p>\n<p>Genom att se till att varje Django-instans har en annan <a class=\"reference internal\" href=\"/sv/6.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> kan du se till att det inte blir några kollisioner i cache-värden.</p>\n</section>\n<section id=\"cache-versioning\">\n<span id=\"id14\"></span><h3>Versionering av cachen<a class=\"heading-anchor\" href=\"#cache-versioning\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du ändrar körkod som använder cachade värden kan du behöva rensa bort eventuella befintliga cachade värden. Det enklaste sättet att göra detta är att rensa hela cacheminnet, men det kan leda till att cacheminnevärden som fortfarande är giltiga och användbara går förlorade.</p>\n<p>Django tillhandahåller ett bättre sätt att rikta in sig på enskilda cache-värden. Djangos cache-ramverk har en systemomfattande versionsidentifierare, som anges med hjälp av cache-inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>. Värdet på denna inställning kombineras automatiskt med cacheprefixet och den användartillhandahållna cachekoden för att erhålla den slutliga cachekoden.</p>\n<p>Som standard kommer alla nyckelbegäran automatiskt att inkludera webbplatsens standardversion av cache-nyckeln. De primitiva cachefunktionerna innehåller dock alla ett <code class=\"docutils literal notranslate\"><span class=\"pre\">version</span></code>-argument, så att du kan ange en viss cache-nyckelversion för att ställa in eller hämta. Till exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Set version 2 of a cache key</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">set</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hello world!&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get the default version (assuming version=1)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Get version 2 of the same key</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello world!&#39;</span>\n</code></pre></div>\n<p>Versionen av en specifik nyckel kan ökas och minskas med hjälp av metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">incr_version()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">decr_version()</span></code>. Detta gör att specifika nycklar kan flyttas till en ny version, medan andra nycklar inte påverkas. Fortsättning på vårt tidigare exempel:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Increment the version of &#39;my_key&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">incr_version</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># The default version still isn&#39;t available</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"go\"># Version 2 isn&#39;t available, either</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n<span class=\"go\">None</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># But version 3 *is* available</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;my_key&quot;</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;hello world!&#39;</span>\n</code></pre></div>\n</section>\n<section id=\"cache-key-transformation\">\n<span id=\"id15\"></span><h3>Transformation av cache-nyckel<a class=\"heading-anchor\" href=\"#cache-key-transformation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Som beskrivs i de två föregående avsnitten används inte den cachekod som en användare anger ordagrant, utan den kombineras med cacheprefixet och nyckelversionen för att ge en slutlig cachekod. Som standard sammanfogas de tre delarna med hjälp av kolon för att skapa en slutlig sträng:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">make_key</span><span class=\"p\">(</span><span class=\"n\">key</span><span class=\"p\">,</span> <span class=\"n\">key_prefix</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\">:</span><span class=\"si\">%s</span><span class=\"s2\">:</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">key_prefix</span><span class=\"p\">,</span> <span class=\"n\">version</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om du vill kombinera delarna på olika sätt eller tillämpa annan bearbetning på den slutliga nyckeln (t.ex. ta en hashdigest av nyckeldelarna) kan du tillhandahålla en anpassad nyckelfunktion.</p>\n<p>Cacheinställningen <a class=\"reference internal\" href=\"/sv/6.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> anger en prickad sökväg till en funktion som motsvarar prototypen för <code class=\"docutils literal notranslate\"><span class=\"pre\">make_key()</span></code> ovan. Om den anges kommer denna anpassade nyckelfunktion att användas i stället för standardfunktionen för nyckelkombination.</p>\n</section>\n<section id=\"cache-key-warnings\">\n<h3>Varningar för cache-nycklar<a class=\"heading-anchor\" href=\"#cache-key-warnings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Memcached, den mest använda produktionscache-backend, tillåter inte cache-nycklar som är längre än 250 tecken eller innehåller blanksteg eller kontrolltecken, och användning av sådana nycklar kommer att orsaka ett undantag. För att uppmuntra cache-portabel kod och minimera obehagliga överraskningar utfärdar de andra inbyggda cache-backends en varning (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.CacheKeyWarning</span></code>) om en nyckel används som skulle orsaka ett fel på memcached.</p>\n<p>Om du använder en produktionsbackend som kan acceptera ett bredare utbud av nycklar (en anpassad backend eller en av de inbyggda backend som inte är memcached) och vill använda detta bredare utbud utan varningar, kan du tysta <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheKeyWarning</span></code> med den här koden i modulen <code class=\"docutils literal notranslate\"><span class=\"pre\">management</span></code> i en av dina <a class=\"reference internal\" href=\"/sv/6.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=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">warnings</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">CacheKeyWarning</span>\n\n<span class=\"n\">warnings</span><span class=\"o\">.</span><span class=\"n\">simplefilter</span><span class=\"p\">(</span><span class=\"s2\">&quot;ignore&quot;</span><span class=\"p\">,</span> <span class=\"n\">CacheKeyWarning</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Om du istället vill tillhandahålla anpassad logik för nyckelvalidering för en av de inbyggda backends kan du underklassa den, åsidosätta bara metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_key</span></code> och följa instruktionerna för <a class=\"reference internal\" href=\"#id9\">använda en anpassad cache-backend</a>. Till exempel, för att göra detta för <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code> backend, lägg den här koden i en modul:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.cache.backends.locmem</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LocMemCache</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomLocMemCache</span><span class=\"p\">(</span><span class=\"n\">LocMemCache</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">validate_key</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">key</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Custom validation, raising exceptions or warnings as needed.&quot;&quot;&quot;</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>…och använd den prickade Python-sökvägen till den här klassen i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a>-delen av din <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>-inställning.</p>\n</section>\n</section>\n<section id=\"asynchronous-support\">\n<span id=\"id16\"></span><h2>Asynkront stöd<a class=\"heading-anchor\" href=\"#asynchronous-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django har utvecklat stöd för asynkrona cache-backends, men har ännu inte stöd för asynkron cachelagring. Det kommer att komma i en framtida version.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.BaseCache</span></code> har asynkrona varianter av <a class=\"reference internal\" href=\"#cache-basic-interface\"><span class=\"std std-ref\">alla basmetoder</span></a>. Av konvention är de asynkrona versionerna av alla metoder prefixerade med <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>. Som standard är argumenten för båda varianterna desamma:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">await</span> <span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">aset</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">await</span> <span class=\"n\">cache</span><span class=\"o\">.</span><span class=\"n\">ahas_key</span><span class=\"p\">(</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n</section>\n<section id=\"downstream-caches\">\n<span id=\"id17\"></span><h2>Cacher nedströms<a class=\"heading-anchor\" href=\"#downstream-caches\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Hittills har detta dokument fokuserat på cachelagring av dina <em>egna</em> data. Men en annan typ av cachelagring är också relevant för webbutveckling: cachelagring som utförs av ”downstream”-cacher. Det är system som cachar sidor för användare redan innan förfrågan når din webbplats.</p>\n<p>Här är några exempel på downstream-cacher:</p>\n<ul class=\"simple\">\n<li><p>När du använder HTTP kan din <abbr title=\"Internet Service Provider\">ISP</abbr> cachelagra vissa sidor, så om du begärde en sida från <code class=\"docutils literal notranslate\"><span class=\"pre\">http://example.com/</span></code> skulle din ISP skicka sidan till dig utan att behöva gå direkt till example.com. Underhållarna av example.com har ingen kännedom om denna cachelagring; ISP:n sitter mellan example.com och din webbläsare och hanterar all cachelagring på ett transparent sätt. Sådan cachelagring är inte möjlig under HTTPS eftersom det skulle utgöra en man-in-the-middle-attack.</p></li>\n<li><p>Din Django-webbplats kan ligga bakom en <em>proxy-cache</em>, till exempel Squid Web Proxy Cache (<a class=\"reference external\" href=\"http://www.squid-cache.org/\">http://www.squid-cache.org/</a>), som cachelagrar sidor för prestanda. I det här fallet skulle varje begäran först hanteras av proxyn, och den skulle skickas till din applikation endast om det behövs.</p></li>\n<li><p>Även din webbläsare cachar sidor. Om en webbsida skickar ut lämpliga rubriker kommer din webbläsare att använda den lokala cachade kopian för efterföljande förfrågningar till den sidan, utan att ens kontakta webbsidan igen för att se om den har ändrats.</p></li>\n</ul>\n<p>Cachelagring nedströms är en trevlig effektivitetshöjare, men det finns en fara med det: Innehållet på många webbsidor skiljer sig åt beroende på autentisering och en mängd andra variabler, och cachesystem som blint sparar sidor baserat enbart på webbadresser kan exponera felaktiga eller känsliga data för efterföljande besökare på dessa sidor.</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>Lyckligtvis erbjuder HTTP en lösning på detta problem. Det finns ett antal HTTP-rubriker som instruerar nedströmscacher att variera innehållet i cacheminnet beroende på angivna variabler och som talar om för cachemekanismer att de inte ska cacha vissa sidor. Vi kommer att titta på några av dessa rubriker i de avsnitt som följer.</p>\n</section>\n<section id=\"using-vary-headers\">\n<span id=\"id18\"></span><h2>Använda <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>-rubriker<a class=\"heading-anchor\" href=\"#using-vary-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Headern <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> definierar vilka förfrågningsheaders som en cachemekanism ska ta hänsyn till när den bygger upp sin cache-nyckel. Om t.ex. innehållet på en webbsida beror på användarens språkpreferens, sägs sidan ”variera på språk”</p>\n<p>Som standard skapar Djangos cachesystem sina cache-nycklar med hjälp av den begärda fullständigt kvalificerade URL:en - t.ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://www.example.com/stories/2005/?order_by=author&quot;</span></code>. Detta innebär att varje begäran till den webbadressen kommer att använda samma cachade version, oavsett skillnader i användaragenter som cookies eller språkpreferenser. Men om den här sidan producerar olika innehåll baserat på någon skillnad i förfrågningsrubrikerna - till exempel en cookie, ett språk eller en användaragent - måste du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>-rubriken för att berätta för cachemekanismerna att sidans utdata beror på dessa saker.</p>\n<p>För att göra detta i Django, använd den praktiska <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.vary.vary_on_headers\" title=\"django.views.decorators.vary.vary_on_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_headers()</span></code></a> vydekorator, så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.vary</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">vary_on_headers</span>\n\n\n<span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;User-Agent&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>I det här fallet kommer en cachemekanism (t.ex. Djangos egen cachemellanvara) att cacha en separat version av sidan för varje unik användaragent.</p>\n<p>Fördelen med att använda dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> i stället för att manuellt ställa in rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> (med något som <code class=\"docutils literal notranslate\"><span class=\"pre\">response.headers['Vary']</span> <span class=\"pre\">=</span> <span class=\"pre\">'user-agent'</span></code>) är att dekoratorn <em>lägger till</em> rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> (som kanske redan finns), i stället för att ställa in den från början och potentiellt åsidosätta något som redan fanns där.</p>\n<p>Du kan skicka flera rubriker till <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;User-Agent&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Cookie&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Detta innebär att nedströmscacher varierar på <em>båda</em>, vilket innebär att varje kombination av user-agent och cookie får sitt eget cachervärde. Till exempel kommer en begäran med user-agent <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> och cookie-värdet <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=bar</span></code> att betraktas annorlunda än en begäran med user-agent <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> och cookie-värdet <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=ham</span></code>.</p>\n<p>Eftersom det är så vanligt att variera på cookie finns det en <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie\" title=\"django.views.decorators.vary.vary_on_cookie\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_cookie()</span></code></a> dekorator. Dessa två vyer är likvärdiga:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"nd\">@vary_on_cookie</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\n<span class=\"nd\">@vary_on_headers</span><span class=\"p\">(</span><span class=\"s2\">&quot;Cookie&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>De rubriker som du skickar till <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> är inte skiftlägeskänsliga; <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;User-Agent&quot;</span></code> är samma sak som <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;user-agent&quot;</span></code>.</p>\n<p>Du kan också använda en hjälpfunktion, <a class=\"reference internal\" href=\"/sv/6.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>, direkt. Denna funktion ställer in, eller lägger till, <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span> <span class=\"pre\">header</span></code>. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">patch_vary_headers</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;template_name&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n    <span class=\"n\">patch_vary_headers</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Cookie&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">patch_vary_headers</span></code> tar en <a class=\"reference internal\" href=\"/sv/6.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>-instans som sitt första argument och en lista/tupel av skiftlägesokänsliga headernamn som sitt andra argument.</p>\n<p>Mer information om Vary-rubriker finns i <span class=\"target\" id=\"index-7\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#avsnitt-12.5.5\"><strong>officiella Vary-specifikationer</strong></a>.</p>\n<aside class=\"admonition-cachemiddleware-varies-on-authorization-automatically admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">CacheMiddleware</span></code> varies on <code class=\"docutils literal notranslate\"><span class=\"pre\">Authorization</span></code> automatically</p>\n<p>Although varying on <code class=\"docutils literal notranslate\"><span class=\"pre\">Authorization</span></code> is not strictly necessary given that\n<span class=\"target\" id=\"index-1\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html#section-3.5\"><strong>RFC 9111 Section 3.5</strong></a> allows caches to avoid reusing authenticated\nresponses, Django’s <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheMiddleware</span></code> adds <code class=\"docutils literal notranslate\"><span class=\"pre\">Authorization</span></code> to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header to simplify construction of cache keys.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"6.0.6\">\n<p class=\"version-note-title\">Changed in Django 6.0.6</p><p>Previously, <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> did not vary on <code class=\"docutils literal notranslate\"><span class=\"pre\">Authorization</span></code> for\nrequests bearing that header.</p>\n</aside>\n</section>\n<section id=\"controlling-cache-using-other-headers\">\n<h2>Kontroll av cache: Använda andra rubriker<a class=\"heading-anchor\" href=\"#controlling-cache-using-other-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Andra problem med cachelagring är integriteten för data och frågan om var data ska lagras i en kaskad av cacher.</p>\n<p>En användare har vanligtvis två typer av cacheminnen: den egna webbläsarens cacheminne (ett privat cacheminne) och leverantörens cacheminne (ett publikt cacheminne). En publik cache används av flera användare och kontrolleras av någon annan. Detta innebär problem med känsliga data - du vill till exempel inte att ditt bankkontonummer ska lagras i en publik cache. Webbapplikationer behöver därför ett sätt att tala om för cacher vilka data som är privata och vilka som är offentliga.</p>\n<p>Lösningen är att ange att en sidas cache ska vara ”privat” För att göra detta i Django, använd <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> vydekorator. Exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_control</span>\n\n\n<span class=\"nd\">@cache_control</span><span class=\"p\">(</span><span class=\"n\">private</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Denna dekoratör tar hand om att skicka ut lämplig HTTP-header bakom kulisserna.</p>\n<p>Observera att cachekontrollinställningarna ”private” och ”public” är ömsesidigt uteslutande. Dekoratorn säkerställer att ”public”-direktivet tas bort om ”private” ska ställas in (och vice versa). Ett exempel på användning av de två direktiven är en blogg som erbjuder både privata och offentliga inlägg. Offentliga poster kan cachelagras på vilken delad cache som helst. Följande kod använder <a class=\"reference internal\" href=\"/sv/6.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>, det manuella sättet att ändra cache-kontrollhuvudet (det kallas internt av <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>-dekoratorn):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">patch_cache_control</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.vary</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">vary_on_cookie</span>\n\n\n<span class=\"nd\">@vary_on_cookie</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">list_blog_entries_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_anonymous</span><span class=\"p\">:</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render_only_public_entries</span><span class=\"p\">()</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">public</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render_private_and_public_entries</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">private</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Du kan kontrollera nedströmscacher på andra sätt också (se <span class=\"target\" id=\"index-8\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html\"><strong>RFC 9111</strong></a> för detaljer om HTTP-cachning). Till exempel, även om du inte använder Djangos cache-ramverk på serversidan, kan du fortfarande berätta för klienter att cacha en vy under en viss tid med <span class=\"target\" id=\"index-9\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html#section-5.2.2.1\"><strong>max-age</strong></a>-direktivet:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_control</span>\n\n\n<span class=\"nd\">@cache_control</span><span class=\"p\">(</span><span class=\"n\">max_age</span><span class=\"o\">=</span><span class=\"mi\">3600</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>(Om du <em>använd</em> mellanvaran för cachelagring ställer den redan in <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> med värdet för inställningen <a class=\"reference internal\" href=\"/sv/6.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>. I så fall kommer den anpassade <code class=\"docutils literal notranslate\"><span class=\"pre\">max_age</span></code> från <a class=\"reference internal\" href=\"/sv/6.1/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>-dekoratorn att ha företräde, och rubrikvärdena kommer att slås samman korrekt)</p>\n<p>Alla giltiga svarsdirektiv för <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> är giltiga i <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code>. Här är några fler exempel:</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>Den fullständiga listan över kända direktiv finns i ”IANA registry” (observera att inte alla direktiv gäller för svar).</p>\n<p>Om du vill använda rubriker för att inaktivera cachning helt och hållet är <a class=\"reference internal\" href=\"/sv/6.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> en vydekorator som lägger till rubriker för att säkerställa att svaret inte kommer att cachas av webbläsare eller andra cachar. Exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">never_cache</span>\n\n\n<span class=\"nd\">@never_cache</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">myview</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"order-of-middleware\">\n<h2>Beställning av <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code><a class=\"heading-anchor\" href=\"#order-of-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Om du använder mellanprogram för cache är det viktigt att du placerar varje halva på rätt plats i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>-inställningen. Det beror på att cachemellanvaran måste veta vilka rubriker som ska användas för att variera cachelagringen. Middleware lägger alltid till något i svarshuvudet <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> när det kan.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> körs under svarsfasen, där middleware körs i omvänd ordning, så ett objekt högst upp i listan körs <em>sist</em> under svarsfasen. Därför måste du se till att <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> visas <em>före</em> alla andra mellanprogram som kan lägga till något i <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>-headern. Följande middleware-moduler gör detta:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> lägger till <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> lägger till <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> lägger till <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> körs å andra sidan under request-fasen, där middleware tillämpas först till sist, så ett objekt högst upp i listan körs <em>först</em> under request-fasen. <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> måste också köras efter att annan middleware uppdaterar <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>-huvudet, så <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> måste vara <em>efter</em> alla objekt som gör det.</p>\n</section>","rootId":"django-s-cache-framework","toc":[{"title":"Uppsättning av cachen","anchor":"setting-up-the-cache","children":[{"title":"Memcached","anchor":"memcached","children":[]},{"title":"Redis","anchor":"redis","children":[]},{"title":"Cachelagring av databas","anchor":"database-caching","children":[{"title":"Skapa cache-tabellen","anchor":"creating-the-cache-table","children":[]},{"title":"Flera databaser","anchor":"multiple-databases","children":[]}]},{"title":"Cachelagring i filsystem","anchor":"filesystem-caching","children":[]},{"title":"Cachelagring i lokalt minne","anchor":"local-memory-caching","children":[]},{"title":"Dummy-cachelagring (för utveckling)","anchor":"dummy-caching-for-development","children":[]},{"title":"Använda en anpassad cache-backend","anchor":"using-a-custom-cache-backend","children":[]},{"title":"Cache-argument","anchor":"cache-arguments","children":[]}]},{"title":"Cache för varje webbplats","anchor":"the-per-site-cache","children":[]},{"title":"Cache för varje visning","anchor":"the-per-view-cache","children":[{"title":"Ange cache per vy i URLconf","anchor":"specifying-per-view-cache-in-the-urlconf","children":[]}]},{"title":"Cachelagring av mallfragment","anchor":"template-fragment-caching","children":[]},{"title":"API för cache på låg nivå","anchor":"the-low-level-cache-api","children":[{"title":"Tillgång till cachen","anchor":"accessing-the-cache","children":[]},{"title":"Grundläggande användning","anchor":"basic-usage","children":[]},{"title":"Prefixering av nyckel i cacheminnet","anchor":"cache-key-prefixing","children":[]},{"title":"Versionering av cachen","anchor":"cache-versioning","children":[]},{"title":"Transformation av cache-nyckel","anchor":"cache-key-transformation","children":[]},{"title":"Varningar för cache-nycklar","anchor":"cache-key-warnings","children":[]}]},{"title":"Asynkront stöd","anchor":"asynchronous-support","children":[]},{"title":"Cacher nedströms","anchor":"downstream-caches","children":[]},{"title":"Använda Vary-rubriker","anchor":"using-vary-headers","children":[]},{"title":"Kontroll av cache: Använda andra rubriker","anchor":"controlling-cache-using-other-headers","children":[]},{"title":"Beställning av MIDDLEWARE","anchor":"order-of-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"}],"prev":{"docname":"topics/auth/customizing","title":"Anpassa autentiseringen i Django","url":"/sv/6.1/topics/auth/customizing/"},"next":{"docname":"topics/conditional-view-processing","title":"Behandling av villkorlig vy","url":"/sv/6.1/topics/conditional-view-processing/"},"formats":{"html":"/sv/6.1/topics/cache/","markdown":"/sv/6.1/topics/cache.md","json":"/sv/6.1/topics/cache.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/cache.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/cache/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}