{"title":"Kerangka kerja penyimpanan Django","version":"6.0","locale":"id","docname":"topics/cache","url":"/id/6.0/topics/cache/","canonical":"https://djangodocs.dev/id/6.0/topics/cache/","summary":"Pertukaran mendasar dalam situs web dinamis adalah, mereka dinamis. Setiap kali pengguna meminta halaman, peladen jaringan membuat segala macam perhitungan -- mulai…","html":"<h1>Kerangka kerja penyimpanan Django<a class=\"heading-anchor\" href=\"#django-s-cache-framework\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Pertukaran mendasar dalam situs web dinamis adalah, mereka dinamis. Setiap kali pengguna meminta halaman, peladen jaringan membuat segala macam perhitungan -- mulai dari permintaan basisdara hingga membangun cetakan hingga logika bisnis -- untuk membuat halaman yang dilihat pengunjung situs anda. Ini jauh lebih mahal, dari perspektif pemrosesan-overhead, daripada pengaturan peladen read-a-file-off-the-filesystem standar Anda.</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>Itu adalah dimana cache datang.</p>\n<p>Meng-cache sesuatu berarti menyimpan hasil perhitungan yang mahal sehingga anda tidak perlu melakukan perhitungan di lain waktu. Berikut ini beberapa kodesemu yang menjelaskan cara kerjanya untuk halaman web yang dibuat secara dinamis:</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 datang dengan sistem cache kuat yang membiarkan anda mentimpan halaman-halaman dinamis sehingga mereka tidak harus dihitung untuk setiap permintaan. Untuk kenyamanan, Django menawarkan tingkatan berbeda dari butiran cache: Anda dapat cache keluaran dari tampilan khusus, anda dapat cache hanya potongan-potongan yang sulit dihasilkan, atau anda dapat cache kelesuruhan situs anda.</p>\n<p>Django juga bekerja dengan baik dengan cache &quot;hilir&quot;, seperti <a class=\"reference external\" href=\"http://www.squid-cache.org/\">Squid</a> dan cache berbasis browser. Ini adalah jenis cache yang tidak anda kontrol secara langsung, tetapi anda dapat memberikan petunjuk (melalui header HTTP) tentang bagian mana dari situs anda yang harus di-cache, dan bagaimana caranya.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Lihat juga</p>\n<p><a class=\"reference internal\" href=\"/id/6.0/misc/design-philosophies/#cache-design-philosophy\"><span class=\"std std-ref\">Cache Framework design philosophy</span></a> menjelaskan sedikit dari keputusan rancangan dari kerangka kerja.</p>\n</aside>\n<section id=\"setting-up-the-cache\">\n<span id=\"id1\"></span><h2>Mengatur tembolok<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>Sistem cache membutuhkan sejumlah kecil pengaturan. Yaitu, anda harus memberitahu itu dimana data cache anda harus tinggal -- apakah di basisdata, pada sistem berkas atau langsung di memori. Ini adalah keputusan penting yang mempengaruhi penampilan cache anda; ya beberapa jenis cache adalah lebih cepat dari lainnya.</p>\n<p>Pilihan cache anda masuk di pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> di berkas pengaturan anda. Ini adalah sebuah penjelasan dari semua nilai-nilai tersedia untuk <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>.</p>\n<section id=\"memcached\">\n<span id=\"id2\"></span><h3>Memcache<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> adalah server cache yang sepenuhnya berbasis memori, awalnya dikembangkan untuk menangani beban tinggi di LiveJournal.com dan kemudian di-open-source oleh Danga Interactive. Ini digunakan oleh situs-situs seperti Facebook dan Wikipedia untuk mengurangi akses basisdata dan secara dramatis meningkatkan kinerja situs.</p>\n<p>Memcached berjalan sebagai daemon dan memberikan sejumlah tertentu dari RAM. Semua itu lakukan adalah menyediakan antarmuka cepat untuk menambah, mengambil dan menghapus data di cache. Semua data disimpan secara langsung di memori, sehingga tidak ada kelebihan dari basisdata atau penggunaan sistem berkas.</p>\n<p>Setelah memasang Memcached sendiri, anda harus memasang pengikatan Memcached. Ada beberapa binding Python Memcached yang tersedia; keduanya didukung oleh Django adalah <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pylibmc/\">pylibmc</a> dan <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/pymemcache/\">pymemcache</a>.</p>\n<p>Untuk menggunakan Memcache dengan Django:</p>\n<ul class=\"simple\">\n<li><p>Setel <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span> <span class=\"pre\">1</span></code> ke <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyMemcacheCache</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.memcached.PyLibMCCache</span></code> (tergantung pengikatan memcached pilihan anda)</p></li>\n<li><p>Setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> menjadi nilai-nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">ip:port</span></code>, dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">ip</span></code> adalah alamat IP dari daemon memcache dan <code class=\"docutils literal notranslate\"><span class=\"pre\">port</span></code> adalah pangkalan pada Memcache mana yang berjalan, atau menjadi nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">unix:path</span></code>, dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">path</span></code> adalah jalur ke berkas soket Unix Memcache.</p></li>\n</ul>\n<p>Dalam contoh ini, Memcached berjalan di localhost (127.0.0.1) port 11211, menggunakan pengikatan <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>Dalam contoh ini, Memcached tersedia melalui file soket Unix lokal <code class=\"file docutils literal notranslate\"><span class=\"pre\">/tmp/memcached.sock</span></code> menggunakan pengikat <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>Satu fitur yg hebar dari Memcache adalah kemampuannya berbagi sebuah cache terhadap banyak peladen. Ini berarti anda dapat menjalankan daemon Memcache pada banyak mesin, dan program akan memperlakukan kelompok mesin sebagai cache <em>tunggal</em>, tanpa butuh menggandakan nilai-nilai cache pada setiap mesin. Untuk mengambil keuntungan fitur ini, sertakan semua alamat peladen dalam <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span> <span class=\"pre\">1</span></code>,antara sebagai titik koma atau string dipisahkan koma, atau sebagai sebuah daftar.</p>\n<p>Di contoh ini, penyimpanan dibagi terhadao instance Memcache berjalan pada alamat IP 172.19.26.240 dan 172.19.26.242, keduanya di 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>Di contoh berikut, cache dibagi terhadap instance Memcache berjalan pada alamat IP 172.19.26.240 (port 11211), 172.19.26.242 (port 11212), dan 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>Secara awalan, backend <code class=\"docutils literal notranslate\"><span class=\"pre\">PyMemcacheCache</span></code> menyetel pilihan berikut (anda dapat menimpa mereka dalam <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;allow_unicode_keys&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;default_noreply&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;serde&quot;</span><span class=\"p\">:</span> <span class=\"n\">pymemcache</span><span class=\"o\">.</span><span class=\"n\">serde</span><span class=\"o\">.</span><span class=\"n\">pickle_serde</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Sebuah titik akhir tentang Memcached adalah cache berdasarkan-memori mempunyai kerugian: karena data cache disimpan di memori, data akan hilang jika peladen anda gagal. Jelasnya, memori tidak diperuntukkan untuk penyimpanan data tetap, jadi jangan bergantung oada cache berdasarkan-memori sebagai penyimpanan data anda satu-satunya -- mereka adalah diperuntukkan pemecahan untuk cache, bukan penyimpanan -- tetapi kami menitikkan ini disini karena cache berdasarkan-memori adalah khususnya sementara.</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> adalah basisdata dalam memori yang dapat digunakan untuk caching. Untuk memulai, anda memerlukan server Redis yang berjalan secara lokal atau di mesin jarak jauh.</p>\n<p>Setelah menyetel peladen Redis, anda akan butuh memasang ikatan Python untuk Redis. <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/redis/\">redis-py</a> adalah ikatan didukung secara asli oleh Django. Memasang paket <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/hiredis/\">hiredis-py</a> juga dianjurkan.</p>\n<p>Untuk menggunakan Redis sebagai backend cache anda dengan Django:</p>\n<ul class=\"simple\">\n<li><p>Setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> menjadi <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=\"/id/6.0/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>Sebagai contoh, jika Redis berjalan pada 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>Seringkali peladen Redis dilindungi dengan autentikasi. Untuk memasukkan nama pengguna dan kata sandi, tambahkan di <code class=\"docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code> bersama dengan 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>Jika anda memiliki beberapa peladen Redis yang diatur dalam suasana replikasi, anda dapat menentukan peladen baik sebagai string yang dipisahkan titik koma atau koma, atau sebagai daftar. Saat menggunakan banyak peladen , operasi tulis dilakukan di peladen pertama (pemimpin). Operasi baca dilakukan di peladen lain (replika) yang dipilih secara acak</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>Menembolok basisdata<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 dapat menyimpan data temboloknya dalam basisdata anda. Ini bekerja baik jika anda mendapatkan cepat, peladen basisdata diindeks baik.</p>\n<p>Untuk menggunakan tabel basisdata sebagai backend tembolok anda:</p>\n<ul class=\"simple\">\n<li><p>Setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.db.DatabaseCache</span></code></p></li>\n<li><p>Setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">tablename</span></code>, nama dari tabel basisdata. Nama ini dapat menjadi apapun anda inginkan, selama dia adalah nama tabel yang sah yang tidak sedang digunakan dalam basisdata anda.</p></li>\n</ul>\n<p>Dalam contoh ini, nama tabel tembolok adalah <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>Tidak seperti backend cache lainnya, cache basisdata tidak mendukung pemusnahan otomatis masukan yang kedaluwarsa di tingkat basisdata. Sebagai gantinya, masukan cache yang kedaluwarsa akan diambil setiap kali <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code>, atau <code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> dipanggil.</p>\n<section id=\"creating-the-cache-table\">\n<span id=\"database-caching-creating-the-table\"></span><h4>Membuat tabel tembolok<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>Sebelum menggunakan cache basisdata, anda harus membuat tabel cache dengan perintah ini:</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>Ini membuat tabel di basisdata anda yaitu dalam bentuk sesuai yang sistem tembolok-basidata harapkan. Nama dari tabel diambil dari <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>.</p>\n<p>Jika anda menggunakan banyak basisdata tembolok, <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> membuat satu tabel untuk setiap tembolok.</p>\n<p>Jika anda menggunakan banyak basisdata, <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> mengamati cara <code class=\"docutils literal notranslate\"><span class=\"pre\">allow_migrate()</span></code> dari perute basisdata anda (lihat dibawah).</p>\n<p>Seperti <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a>, <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#django-admin-createcachetable\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">createcachetable</span></code></a> tidak akan menyentuh tabel yang ada. Dia tidak akan membuat tabel-tabel hilang.</p>\n<p>Untuk mencetak SQL yang akan menjalankan, daripada menjalankannya, gunakan pilihan <a class=\"reference internal\" href=\"/id/6.0/ref/django-admin/#cmdoption-createcachetable-dry-run\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">createcachetable</span> <span class=\"pre\">--dry-run</span></code></a>.</p>\n</section>\n<section id=\"multiple-databases\">\n<span id=\"database-caching-multiple-databases\"></span><h4>Basisdata banyak<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>Jika anda menggunakan penembolokan basisdata dengan banyak basisdata, anda akan juga butuh menyetel perintah perutean untuk tabel tembolok basisdata anda. Untuk tujuan perutean, tabel tembolok basisdata muncul sebagai model dinamai <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheEntry</span></code>, di aplikasi dinamai <code class=\"docutils literal notranslate\"><span class=\"pre\">django_cache</span></code>. Model ini tidak akan muncul dalam model tembolok, tetapi rincian model dapat digunakan untuk tujuan perutean.</p>\n<p>Sebagai contoh, perute berikut akan melangsungkan semua tindakan pembacaan tembolok ke <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_replica</span></code>, dan semua tindakan penulisan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_primary</span></code>. Tabel tembolok hanya disinkronisasikan kedalam  <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>Jika anda tidak menentukan arah perute untuk model cache basisdata, backend cache akan menggunakan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>.</p>\n<p>Dan jika anda tidak menggunakan backend cache basisdata, anda tidak perlu khawatir untuk menyediakan instruksi perutean untuk model cache basisdata.</p>\n</section>\n</section>\n<section id=\"filesystem-caching\">\n<span id=\"id7\"></span><h3>Cache sistem berkas<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>Serial backend berdasarkan-berkas dan menyimpan setiap nilai cache sebagai berkas terpisah. Untuk menggunakan backend ini setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.filebased.FileBasedCache&quot;</span></code> dan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> menjadi direktori yang cocok. Sebagai contoh, untuk menyimpan data di <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code>, gunakan pengaturan ini:</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>Jika anda berada di Windows, taruh huruf drive pada awal jalur, seperti ini:</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>Jalur direktori harus mutlak -- yaitu, itu harus dimulai pada induk dari sistem berkas anda. Itu tidak mengapa apakah anda menaruh sebuah garis miring pada akhir pengaturan.</p>\n<p>Pastikan direktori yang ditunjuk oleh pengaturan ini ada dan dapat dibaca dan ditulis, atau dapat dibuat oleh pengguna sistem tempat peladen jaringan anda berjalan. Melanjutkan contoh di atas, jika peladen anda berjalan sebagai pengguna <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>, pastikan direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">/var/tmp/django_cache</span></code> ada dan dapat dibaca dan ditulis oleh pengguna <code class=\"docutils literal notranslate\"><span class=\"pre\">apache</span></code>, atau bahwa dapat dibuat oleh pengguna <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\">Peringatan</p>\n<p>Ketika cache <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> terdapat dalam <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a>, <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-STATIC_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATIC_ROOT</span></code></a>, atau <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-STATICFILES_FINDERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STATICFILES_FINDERS</span></code></a>, data sensitif mungkin terbuka.</p>\n<p>Penyerang yang mendapatkan akses ke berkas tembolok tidak hanya dapat memalsukan konten HTML, yang akan dipercaya oleh situs anda, tetapi juga mengeksekusi kode arbitrer dari jarak jauh, karena data tersebut diserialisasi menggunakan <a class=\"reference external\" href=\"https://docs.python.org/3/library/pickle.html#module-pickle\" title=\"(di 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\">Peringatan</p>\n<p>Caching sistem berkas mungkin menjadi lambat saat menyimpan berkas dalam jumlah besar. Jika anda mengalami masalah ini, pertimbangkan untuk menggunakan mekanisme caching yang berbeda. Anda juga dapat membuat subkelas <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/Django/core/cache/backends/filebased.py\">FileBasedCache</a> dan meningkatkan strategi pemusnahan.</p>\n</aside>\n</section>\n<section id=\"local-memory-caching\">\n<span id=\"id8\"></span><h3>Cache memori-lokal<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>Ini adalah cache awalan jika lainnya tidak ditentukan di berkas pengaturan anda. Jika anda ingin mempercepat keuntungan dari cace di-memori tetapi tidak mempunyai kemampuan dari menjalankan Memcached, perimbangkan backend cache memori-lokal. Cache ini adalah per-pengolahan (lihat dibawah) dan thread-safe. Untuk menggunakan itu, setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;django.core.cache.backends.locmem.LocMemCache&quot;</span></code>. Sebagai contoh:</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>Cache <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a> digunakan untuk mencirikan penyimpanan memori tersendiri. Jika anda hanya mempunyai satu cache <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, anda dapat mengabaikan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-LOCATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCATION</span></code></a>; bagaimanapun, jikla anda mempunyai lebih dari satu cache memori lokal, anda akan butuh memberikan sebuah nama pada setidaknya satu dari mereka agar menjaga mereka terpisah.</p>\n<p>Penyimpanan sementara menggunakan strategi pemusnahan least-recently-used (LRU).</p>\n<p>Perhatikan bahwa setiap proses akan memiliki instance tembolok pribadinya sendiri, yang berarti tidak ada caching lintas proses yang memungkinkan. Ini juga berarti tembolok memori lokal tidak terlalu hemat memori, jadi ini mungkin bukan pilihan yang baik untuk lingkungan produksi. Ini bagus untuk pengembangan.</p>\n</section>\n<section id=\"dummy-caching-for-development\">\n<span id=\"dummy-caching\"></span><h3>Cache tiruan (untuk pengembangan)<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>Akhirnya, Django datang dengan cache &quot;dummy&quot; yang tidak sebenarnya cache -- itu hanya menerapkan antarmuka cache tanpa melakukan apapun.</p>\n<p>Ini adalah sangat berguna jika anda mempunyai situs produksi yang menggunakan cache pekerjaan-berat di beragam tempat tetapi lingkungan pengembangan/percobaan dimana anda tidak ingin cache dan tidak ingin merubah kode anda pada kasus-khusus terakhir. Untuk mengaktifkan cache dummy, setel <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> seperti begitu:</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>Menggunakan backend cache penyesuaian<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>Selagi Django menyertakan dukungan untuk sejumlah backend cache keluar-dari-kotak, terkadang anda mungkin ingin menggunakan backend cache disesuaikan. Untuk menggunakan backend cache luar dengan Django, gunakan jalur impor Python sebagai <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> dari <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting, seperti begitu:</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>Jika anda membuat backend anda sendiri, anda dapat menggunakan backend tembolok standar sebagai penerapan acuan. Anda akan menemukan kode di direktori <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/6.0.x/django/core/cache/backends/\">django/core/cache/backends/</a> dari sumber Django.</p>\n<p>Catatan: Tanpa alasan yang benar-benar kuat, seperti host yang tidak mendukungnya, anda harus tetap menggunakan backend tembolok yang disertakan dengan Django. Mereka telah diuji dengan baik dan didokumentasikan dengan baik.</p>\n</section>\n<section id=\"cache-arguments\">\n<span id=\"id10\"></span><h3>Argumen cache<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>Setiap backend cache dapat memberikan argumen tambahan untuk mengendalikan perilaku cache. Argumen-argumen ini disediakan sebagai kunci-kunci tambahan di pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>. Argumen-argumen sah seperti berikut:</p>\n<ul>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-TIMEOUT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code></a>: Awalan waktu habis, dalam detik, untuk digunakan untuk cache. Awalan argumen ini pada <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code> detik (5 menit). Anda dapat mensetel <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> sehingga, secara awalan, kunci-kunci cache tidak pernah kadaluarsa. Sebuah nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> menyebabkan kunci segera kadaluarsa (efektifnya &quot;don't cache&quot;).</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>: Pilihan apapun yang harus dilewatkan ke backend cache. Daftar dari pilihan sah akan beragam dengan setiap backend, dan backend cache oleh pustaka pihak-ketiga akan melewatkan pilihan mereka langsung ke pustaka cache pokok.</p>\n<p>Backend cache yang menerapkan strategi pemusnahan mereka sendiri (yaitu, backend <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">filesystem</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code>) akan menghormati pilihan-pilihan berikut:</p>\n<ul>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code>: Nomor maksimal dari masukan diizinkan di cache sebelum nilai-nilai lama dihapus. Argumen ini awalan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">300</span></code>.</p></li>\n<li><p>CULL_FREQUENCY`: Pecahan masukan yang dimusnahkan ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> dicapai. Rasio sebenarnya adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span> <span class=\"pre\">/</span> <span class=\"pre\">CULL_FREQUENCY</span></code>, jadi menyetel <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> pada pemusnahan setengah masukan ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES``dicapai.</span> <span class=\"pre\">Argumen</span> <span class=\"pre\">ini</span> <span class=\"pre\">harus</span> <span class=\"pre\">berupa</span> <span class=\"pre\">integer</span> <span class=\"pre\">dan</span> <span class=\"pre\">awalan</span> <span class=\"pre\">pada</span> <span class=\"pre\">``3</span></code>.</p>\n<p>Sebuah nilai dari <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">CULL_FREQUENCY</span></code> berarti bahwa keseluruhan cache akan dibuang ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">MAX_ENTRIES</span></code> dicapai. Pada beberapa backend (<code class=\"docutils literal notranslate\"><span class=\"pre\">database</span></code> khususnya) ini membuat pemusnahan <em>jauh</em> lebih cepat pada pengeluaran dari lebih cache luput.</p>\n</li>\n</ul>\n<p>Backend Memcached dan Redis melewatkan isi <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> sebagai argumen kata kunci ke constructor klien, mengizinkan untuk kendali tingkatan lebih dari perilaku klien. Contoh penggunaan, lihat dibawaah.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>: Sebuah string yang akan otomatis disertakan (ditambahkan secara awalan) ke semua kunci-kunci cache digunakan oleh peladen Django.</p>\n<p>Lihat <a class=\"reference internal\" href=\"#cache-key-prefixing\"><span class=\"std std-ref\">cache documentation</span></a> untuk informasi lebih.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>: Nomor versi awalan untuk kunci-kunci cache dibangkitkan oleh peladen Django.</p>\n<p>Lihat the <a class=\"reference internal\" href=\"#cache-versioning\"><span class=\"std std-ref\">cache documentation</span></a> untuk informasi lebih.</p>\n</li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a> Sebuah string mengandung jalur bertitik pada sebuah fungsi yang menentukan bagaimana menyusun sebuah awalan, versi dan kunci kedalam kunci cache akhir.</p>\n<p>Lihat <a class=\"reference internal\" href=\"#cache-key-transformation\"><span class=\"std std-ref\">cache documentation</span></a> untuk informasi lebih.</p>\n</li>\n</ul>\n<p>Di contoh ini, backend sistem berkas sedang dikonfigurasikan dengan waktu habis dari 60 detik, dan kapasitas maksimal dari 1000 barang:</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>Ini adalah sebuah contoh konfigurasi untuk backend berdasarkan <code class=\"docutils literal notranslate\"><span class=\"pre\">pylibmc</span></code> yang mengadakan protokol biner, autentifikasi SASL, dan suasana perilaku <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>Berikut adalah contoh konfigurasi untuk backend berbasis <code class=\"docutils literal notranslate\"><span class=\"pre\">pymemcache</span></code> yang memungkinkan penyatuan klien (yang dapat meningkatkan performa dengan menjaga klien tetap terhubung), memperlakukan kesalahan memcache/jaringan sebagai tembolok yang hilang, dan menyetel bendera``TCP_NODELAY`` pada soket koneksi</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>Here's an example configuration for a <code class=\"docutils literal notranslate\"><span class=\"pre\">redis</span></code> based backend that selects\ndatabase <code class=\"docutils literal notranslate\"><span class=\"pre\">10</span></code> (by default Redis ships with 16 logical databases), and sets a\ncustom <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> is used by default):</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 per-site<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>Sekali cache disetel, cara termudah menggunakan cacge adalah cache situs anda seluruhnya. Anda akan butuh menambahkan <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.UpdateCacheMiddleware'</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.cache.FetchFromCacheMiddleware'</span></code> ke pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> anda, seperti di contoh ini:</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\">Catatan</p>\n<p>Tidak, itu bukan salah ketik: middleware &quot;update&quot; harus pertama di daftar, dan middleware &quot;fetch&quot; harus di terakhir. Rincian sedikit mengaburkan, tetapi lihat <a class=\"reference internal\" href=\"#order-of-middleware\">Order of MIDDLEWARE</a> dibawah jika anda ingin cerita penuh.</p>\n</aside>\n<p>Kemudian, tambah pengaturan dibutuhkan berikut ke berkas pengaturan Django anda:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_ALIAS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_ALIAS</span></code></a> -- nama lain tembolok untuk digunakan untuk penyimpanan.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a> -- Angka integer dari setiap halaman kedua harus di cache.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_KEY_PREFIX</span></code></a> -- jika cacge dibagi lintas banyak situs menggunakan pemasangan Django sama, setel ke nama dari situs, atau beberapa string lain yang unik pada instance Django ini, untuk mencegah tabrakan kunci. Gunakan sebuah string kosong jika anda tidak peduli.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> cache tanggapan GET dan HEAD dengan keadaan 200, dimana kepala permintaan dan tanggapan diizinkan. Tanggapan pada permintaan untuk URL sama dengan parameter permintaan berbeda dianggap menjadi halaman unik dan di cache terpisah. Middleware ini mengharapkan bahwa sebuah permintaan HEAD dijawab dengan kepala tanggapan sesuai seperti permintaan GET berkaitan; dalam hal ini itu dapat mengembalikan sebuah tanggapan GET cache untuk permintaan HEAD.</p>\n<p>Selain itu, <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> otomatis mensetel beberapa kepala dalam setiap <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> yang mempengaruhi <a class=\"reference internal\" href=\"#downstream-caches\"><span class=\"std std-ref\">downstream caches</span></a>:</p>\n<ul class=\"simple\">\n<li><p>Setel kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> ke tanggal/waktu saat ini ditambah menentukan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a>.</p></li>\n<li><p>Setel kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> untuk memberikan umur maksimal untuk halaman -- kembali, dari pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a>.</p></li>\n</ul>\n<p>Lihat <a class=\"reference internal\" href=\"/id/6.0/topics/http/middleware/\"><span class=\"doc\">Middleware</span></a> untuk lebih pada middleware</p>\n<p>Jika sebuah tampilan menyetel waktu kadaluarsa cache nya sendiri (yaitu itu mempunyai bagian <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> di kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> nya) kemudian halaman akan di cache sampai waktu kadaluarsa, daripada <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a>. menggunakan penghias di <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.cache</span></code> anda dapat dengan mudah mensetel sebuah waktu kadaluarsa tampilan (menggunakan penghias <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>) atau meniadakan cache untuk sebuah tampilan (menggunakan penghias <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">never_cache()</span></code></a> decorator). Lihat bagian <a class=\"reference internal\" href=\"#controlling-cache-using-other-headers\">using other headers</a> pada penghias ini.</p>\n<p id=\"i18n-cache-key\">Jika <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N`disetel</span> <span class=\"pre\">menjadi</span> <span class=\"pre\">``True`</span></code> kemudian membangkitkan kunci cache akan menyertakan nama dari <a class=\"reference internal\" href=\"/id/6.0/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language</span></a> aktif -- lihat juga  <a class=\"reference internal\" href=\"/id/6.0/topics/i18n/translation/#how-django-discovers-language-preference\"><span class=\"std std-ref\">Bagaimana Django menemukan pilihan bahasa</span></a>). Ini mengizinkan anda dengan mudah cache situs banyak bahasa tanpa harus membuat kunci cache anda sendiri.</p>\n<p>Kunci cache juga menyertakan <a class=\"reference internal\" href=\"/id/6.0/topics/i18n/timezones/#default-current-time-zone\"><span class=\"std std-ref\">current time zone</span></a> ketika <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> disetel menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</section>\n<section id=\"the-per-view-cache\">\n<h2>Cache per-tampilan<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>Cara yang lebih terperinci untuk menggunakan kerangka caching adalah dengan menyimpan keluaran dari tampilan individual ke dalam caching. <code class=\"docutils literal notranslate\"><span class=\"pre\">Django.views.decorators.cache</span></code> mendefinisikan dekorator <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> yang akan secara otomatis meng-cache respons tampilan untuk anda:</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> mengambil argumen tunggal: waktu habis cacge, dalam detik. Di contoh diatas, hasil dari tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view()</span></code> akan di cache untuk 15 menit. (catah bahwa kami telah menulis itu sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> untuk tujuan dapat dibaca. <code class=\"docutils literal notranslate\"><span class=\"pre\">60</span> <span class=\"pre\">*</span> <span class=\"pre\">15</span></code> akan di nilai menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">900</span></code> -- yaitu, 15 menit dikalikan oleh 60 detik per menit.)</p>\n<p>Batas waktu tembolok yang ditetapkan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> lebih diutamakan daripada direktif <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> dari kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code>.</p>\n<p>Cache per-tampilan, seperti cache per-site, adalah diambil sebagai datum masukan kendali dari URL. Jika banyak titik URL pada tampilan sama, setiap URL akan di cache terpisah. Melanjutkan contoh <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code>, jika URLconf anda terlihat seperti ini:</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>kemudian permintaan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/1/</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code> akan di cache terpisah, seprti anda mungkin harapkan. Tetapi sekali URL tertentu (sebagai contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/23/</span></code>) telah diminta, permintaan berikut ke URL itu akan menggunakan cache.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> dapat juga mengambil sebuah argumen kata kunci pilihan, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>, yang akan mengalihkan penghias menggunakan cache khusus (dari pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> anda) ketika cache menampilkan hasil. Secara awalan, cache <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> akan digunakan, tetapi anda dapat menentukan cache apapun anda inginkan:</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=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_KEY_PREFIX</span></code></a>\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>Argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> mungkin ditentukan bersama-sama. Argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">key_prefix</span></code> dan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> ditentukan dibawah <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> akan digabungkan.</p>\n<p>Selain itu, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> otomatis mensetel <code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> dan kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Expires</span></code> dalam tanggapan yang mempengaruhi <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=\"/id/6.0/howto/csrf/#csrf-cache-page\"><span class=\"std std-ref\">Menggunakan perlindungan CSRF dengan caching</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>Menentukan cache per-tampilan di 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>Anda dapat melakukannya dengan membungkus fungsi tampilan dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_page</span></code> saat anda merujuknya di URLconf. Inilah URLconf lama dari sebelumnya</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>Ini adalah hal yang sama, dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">my_view</span></code> dibungkus di <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>Cache bgian cetakan<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>Jika anda sedang mengejar lebih kendali, anda dapat juga cache fragmen cetakan menggunakan etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code>. Untuk memberikan akses cetakan anda ke etiket ini, taruh <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> dekat atas dari cetakan anda.</p>\n<p>Etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> menyimpan isi dari blok untuk sejumlah waktu yang diberikan. Itu mengambil setidaknya dua argumen: waktu habis cache, dalam detik, dan nama untuk memberikan bagian cache. Bagian di simpan selamanya jika waktu habis adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Nama akan diambil dengan adanya, jangan menggunakan sebuah variabel. Sebagai contoh:</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>Terkadang anda mungkin ingin menyimpan banyak salinan dari bagian tergantung pada beberapa dinamis data yang muncul didalam bagian. Sebagai contoh, anda mungkin ingin memisahkan salinan tersimpan dari batang sisi digunakan dalam contoh sebelumnya untuks etiap pengguna dari situs anda. Lakukan ini dengan melewatkan satu atau lebih argumen tambahan, yang mungkin berupa variabel dengan atau tanpa penyaring, pada etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">cache</span> <span class=\"pre\">%}</span></code> pada mencirikan secara unik bagian cache:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">cache</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">cache</span> <span class=\"m\">500</span> <span class=\"nv\">sidebar</span> <span class=\"nv\">request.user.username</span> <span class=\"cp\">%}</span>\n    .. sidebar for logged-in user ..\n<span class=\"cp\">{%</span> <span class=\"k\">endcache</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Jika <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span></code></a> disetel menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> cache middleware per-situs akan <a class=\"reference internal\" href=\"#i18n-cache-key\"><span class=\"std std-ref\">respect the active language</span></a>. Untuk etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">cache</span></code> anda dapat menggunakan satu dari <a class=\"reference internal\" href=\"/id/6.0/topics/i18n/translation/#template-translation-vars\"><span class=\"std std-ref\">translation-specific variables</span></a> tersedia di cetakan untuk mencapai hasil sama:</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>Cache waktu habis dapat berupa sebuah variabel cetakan, selama variabel cetakan mengatasi nilai integer. Sebagai contoh, jika variabel cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">my_timeout</span></code> disetel menjadi nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">600</span></code>, kemudian dua contoh berikut adalah setara:</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>Fitur ini berguna untuk menghindari pengulangan pada cetakan. Anda dapat menyetel batas waktu dalam variabel, di satu tempat, dan menggunakan kembali nilai tersebut.</p>\n<p>Secara awalan, etiket cache akan mencoba menggunakan cache dipanggil &quot;template_fragments&quot;. Jika tidak ada cache seperti itu ada, itu akan kembali menggunakan cache awalan. Anda mungkin memilih sebuah backend cache bergantian untuk digunakan dengan argumen kata kunci <code class=\"docutils literal notranslate\"><span class=\"pre\">using</span></code>, yang harus berupa argumen terakhir ke etiket.</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>Itu adalah dianggap sebuah kesalahan untuk menentukan sebuah nama cache yang tidak dikonfigurasi.</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 cache tingkat-bawah<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>Terkadang, cache sebuah seluruhnya halaman dibangun tidak mendapatkan anda sangat banyak, faktanya, nyaman berlebihan.</p>\n<p>Mungkin, sebagai contoh, situs anda menyertakan sebuah tampilan yang hasilnya bergantung pada beberpa permintaan mahal, hasil dari yang berubah pada rentang berbeda. Dalam kasus ini, itu akan tidak sesuai menggunakan cache halaman-penuh yang strategi cache per-situs atau per-tampilan tawarkan, karena anda tidak ingin cache keseluruhan hasil (sejak beberapa data sering berubah), tetapi anda akan masih ingin cache hasil yang jarang berubah.</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=\"(di 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>Mengakses cache<a class=\"heading-anchor\" href=\"#accessing-the-cache\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.caches\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">caches</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.caches\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Anda dapat mengakses cache dikonfigurasikan di pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> melalui obyek seperti-kamus: <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.caches</span></code>. Permintaan berulang untuk nama lain sama di thread sama akan mengembalikab obyek sama.</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>Jika kunci yang dinamai tidak ada, <code class=\"docutils literal notranslate\"><span class=\"pre\">InvalidCacheBackendError</span></code>  akan muncul.</p>\n<p>Untuk menyediakan thread-safety, sebuah instance berbeda dari backend cache akan dikembalikan untuk setiap thread.</p>\n</dd></dl>\n\n<dl class=\"py data\">\n<dt class=\"sig sig-object py\" id=\"django.core.cache.cache\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">django.core.cache.</span></span><span class=\"sig-name descname\"><span class=\"pre\">cache</span></span><a class=\"heading-anchor\" href=\"#django.core.cache.cache\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sebagai jalan pintas, cache awalan tersedia sebagai <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>Obyek ini setara terhadap <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>Penggunaan dasar<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>Antarmuka dasar adalah:</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> harus berupa sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">value</span></code> dapat berupa obyek Python picklable.</p>\n<p>Argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> adalah pilihan dan awalan pada argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> dari backend sesuai di pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> (dijelaskan diatas). Itu adalah jumlah nilai kedua harus disimpan di cache. Melewatkan di <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> akan cache nilai selamanya. Sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> dari <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> tidak akan cache nilai.</p>\n<p>Jika objek tidak ada dalam cache, <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.get()</span></code> mengembalikan <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>JIka anda butuh menentukan apakah objek ada dalam cache dan anda telah menyimpan nilai harfiah <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, gunakan objek penjaga sebagai awalan:</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> can take a <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> argument. This specifies which value to\nreturn if the object doesn't exist in the cache:</p>\n<div class=\"code-block\" data-language=\"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>To add a key only if it doesn't already exist, use the <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> method.\nIt takes the same parameters as <code class=\"docutils literal notranslate\"><span class=\"pre\">set()</span></code>, but it will not attempt to\nupdate the cache if the key specified is already present:</p>\n<div class=\"code-block\" data-language=\"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>Jika anda butuh mengetahui apakah <code class=\"docutils literal notranslate\"><span class=\"pre\">add()</span></code> menyimpan sebuah nilai di cache, anda dapat memeriksa nilai kembalian. Itu akan mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> jika nilai telah disimpan, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> sebaliknya.</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>If you want to get a key's value or set a value if the key isn't in the cache,\nthere is the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_or_set()</span></code> method. It takes the same parameters as <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>\nbut the default is set as the new cache value for that key, rather than\nreturned:</p>\n<div class=\"code-block\" data-language=\"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>Anda juga dapat melewatkan callable apapun sebagai nilai <em>default</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>There's also a <code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> interface that only hits the cache once.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">get_many()</span></code> returns a dictionary with all the keys you asked for that\nactually exist in the cache (and haven't expired):</p>\n<div class=\"code-block\" data-language=\"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>To set multiple values more efficiently, use <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> to pass a\ndictionary of key-value pairs:</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>Seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.set()</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> mengambil sebuah pilihan parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code>.</p>\n<p>Pada backend didukung (memcached), <code class=\"docutils literal notranslate\"><span class=\"pre\">set_many()</span></code> megnembalikan sebuah daftar dari kunci-kunci yang gagal dimasukkan.</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>Anda dapat menghapus kunci secara eksplisit dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> untuk membersihkan cache untuk objek tertentu:</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> returns <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> if the key was successfully deleted, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>\notherwise.</p>\n<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>If you want to clear a bunch of keys at once, <code class=\"docutils literal notranslate\"><span class=\"pre\">delete_many()</span></code> can take a list\nof keys to be cleared:</p>\n<div class=\"code-block\" data-language=\"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> sets a new expiration for a key. For example, to update a key\nto expire 10 seconds from now:</p>\n<div class=\"code-block\" data-language=\"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>Like other methods, the <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> argument is optional and defaults to the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">TIMEOUT</span></code> option of the appropriate backend in the <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a> setting.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">touch()</span></code> mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> jika kunci berhasil disentuh, <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> sebaliknya.</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>You can also increment or decrement a key that already exists using the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">incr()</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code> methods, respectively. By default, the existing cache\nvalue will be incremented or decremented by 1. Other increment/decrement values\ncan be specified by providing an argument to the increment/decrement call. A\nValueError will be raised if you attempt to increment or decrement a\nnonexistent cache key:</p>\n<div class=\"code-block\" data-language=\"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\">Catatan</p>\n<p>Metide <code class=\"docutils literal notranslate\"><span class=\"pre\">incr()</span></code>/<code class=\"docutils literal notranslate\"><span class=\"pre\">decr()</span></code> tidak menjamin menjadi atom, Pada backend itu yang mendukung penaikan/penurunan atom (kebanyakan terutama backend memcache), penaikan dan penurunan akan menjadi atom. Bagaimanapun, jika backend tidak asli menyediakan sebuah tindakan penaikan/penurunan, itu akan diterapkan menggunakan dua-langkah mengambil/memperbaharui.</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>Anda dapat menutup hubungan ke cache anda dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">close()</span></code> jika diterapkan oleh backend cache.</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\">Catatan</p>\n<p>Untuk cache yang tidak menerapkan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">close</span></code> itu adalah no-op.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>The async variants of base methods are prefixed with <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>, e.g.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">cache.aadd()</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">cache.adelete_many()</span></code>. See <a class=\"reference internal\" href=\"#id16\">Asynchronous support</a>\nfor more details.</p>\n</aside>\n</section>\n<section id=\"cache-key-prefixing\">\n<span id=\"id13\"></span><h3>Awalan kunci cache<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>Jika anda sedang berbagi sebuah instance cache diantara peladen, atau diantara lingkungan produksi dan pengembangan anda, itu memungkinkan untuk data cache oleh satu peladen untuk digunakan oleh peladen lain. Jika bentuk dari data cache berbeda diantara peladen, ini dapat membawa ke sangat keras dari mengenal masalah-masalah.</p>\n<p>Untuk mencegah ini, Django menyediakan kemampuan untuk mengawali semua kunci cache digunakan oleh peladen. Ketika kunci cacge tertentu disimpan atau diambil, Django akan secara otomatis mengawali kunci cache dengan nilai dari pengaturan cache <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a>.</p>\n<p>Dengan memastikan setiap instance Django mempunyai <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_PREFIX\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_PREFIX</span></code></a> berbeda, anda dapat memastikan bahwa akan tidak ada tubrukan di nilai-nilai cache.</p>\n</section>\n<section id=\"cache-versioning\">\n<span id=\"id14\"></span><h3>Memversikan cache<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>Ketika anda merubah menjalankan kode yang menggunakan nilai cache, anda mungkin butuh membersihkan nilai-nilai cache yang ada. Cara termudah melakukan ini adalah membilas keseluruhan cache, tetapi ini dapat membawa ke kehilangan nilai cache yang masih sah dan berguna.</p>\n<p>Django menyediakan cara terbaik pada nilai-nilai cache masing-masing sasaran. Kerangka kerja cache Django mempunyai penciri versi lebar-sistem, ditentukan menggunakan pengaturan cache <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-VERSION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">VERSION</span></code></a>. Nilai dari pengaturan ini secara otomatis dipadukan dengan awalan cache dan kunci cache disediakan-pengguna untuk mendapatkan kunci cache akhir.</p>\n<p>By default, any key request will automatically include the site\ndefault cache key version. However, the primitive cache functions all\ninclude a <code class=\"docutils literal notranslate\"><span class=\"pre\">version</span></code> argument, so you can specify a particular cache\nkey version to set or get. For example:</p>\n<div class=\"code-block\" data-language=\"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>The version of a specific key can be incremented and decremented using\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">incr_version()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">decr_version()</span></code> methods. This\nenables specific keys to be bumped to a new version, leaving other\nkeys unaffected. Continuing our previous example:</p>\n<div class=\"code-block\" data-language=\"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>Perubahan kunci cache<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>Seperti digambarkan di dua bagian sebelumnya, kunci cache disediakan oleh seorang pengguna tidak digunakan secara harfiah -- itu dipadukan dengan awalan cache dan versi kunci untuk menyediakan kunci cache akhir. Secara awalan, tiga bagian digabungkan menggunakan titik dua untuk menghasilkan string akhir:</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>Jika anda ingin memadukan bagian-bagian di cara berbeda, atau memberlakukan pengolahan lain menjadi kunci akhir (sebagai contoh, mengambil campuran inti dari bagian-bagian kunci), anda daat menyediakan sebuah fungsi kunci penyesuaian.</p>\n<p>Pengaturan cache <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-KEY_FUNCTION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">KEY_FUNCTION</span></code></a> menentukan jalur-bertitik pada sebuah fungsi mencocokan purwa-rupa dari <code class=\"docutils literal notranslate\"><span class=\"pre\">make_key()</span></code> diatas. Jika disediakan, fungsi kunci penyesuaian ini akan digunakan sebagai gantia dari kunci awalan memadukan fungsi.</p>\n</section>\n<section id=\"cache-key-warnings\">\n<h3>Peringatan kunci cache<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>Memcache, backend cache paling digunakan-umum produksi, tidak mengizinkan kunci cache lebih panjang dari 250 karakter atau mengandung ruang kosong atau kendali karakter, dan menggunakan kunci seperti itu akan menyebabkan sebuah pengecualian. Untuk mendorong kode ringan-cache menerbitkan sebuah peringatan (<code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.CacheKeyWarning</span></code>) jika sebuah kecil yang dapat menyebabkan sebuah kesalahan pada memcache.</p>\n<p>Jika anda sedang menggunakan backend produksi yang dapat menerima jangkauan lebih luas dari kunci (backend penyesuaian, atau satu dari bukan-memcache backend siap-pakai), dan ingin menggunakan jangkauan luas ini tanpa peringatan, anda dapat mendiamkan <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheKeyWarning</span></code> dengan kode ini di modul <code class=\"docutils literal notranslate\"><span class=\"pre\">management</span></code> dari satu dari <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> anda:</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>Jika anda ingin daripada menyediakan penyesuaian logika pengecekan kunci untuk satu dari backend pasang-tetap, anda dapat mensubkelaskannya, timpa hanya metode <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_key</span></code>, dan ikuti petunjuk untuk <a class=\"reference internal\" href=\"#id9\">using a custom cache backend</a>. Sebagai contoh, untuk melakukan ini untuk backend <code class=\"docutils literal notranslate\"><span class=\"pre\">locmem</span></code>, taruh kode ini di 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>...dan menggunakan jalur Python bertitik pada kelas ini di bagain <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES-BACKEND\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">BACKEND</span></code></a> dari pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHES</span></code></a>.</p>\n</section>\n</section>\n<section id=\"asynchronous-support\">\n<span id=\"id16\"></span><h2>Dukungan asinkronus<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 has developing support for asynchronous cache backends, but does not\nyet support asynchronous caching. It will be coming in a future release.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.cache.backends.base.BaseCache</span></code> has async variants of <a class=\"reference internal\" href=\"#cache-basic-interface\"><span class=\"std std-ref\">all\nbase methods</span></a>. By convention, the asynchronous versions\nof all methods are prefixed with <code class=\"docutils literal notranslate\"><span class=\"pre\">a</span></code>. By default, the arguments for both\nvariants are the same:</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>Cache hilir<a class=\"heading-anchor\" href=\"#downstream-caches\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>So far, this document has focused on caching your <em>own</em> data. But another type\nof caching is relevant to web development, too: caching performed by\n&quot;downstream&quot; caches. These are systems that cache pages for users even before\nthe request reaches your website.</p>\n<p>Ini adalah sedikit contoh dari cache hilir:</p>\n<ul class=\"simple\">\n<li><p>When using HTTP, your <abbr title=\"Internet Service Provider\">ISP</abbr> may cache\ncertain pages, so if you requested a page from <code class=\"docutils literal notranslate\"><span class=\"pre\">http://example.com/</span></code>, your\nISP would send you the page without having to access example.com directly.\nThe maintainers of example.com have no knowledge of this caching; the ISP\nsits between example.com and your web browser, handling all of the caching\ntransparently. Such caching is not possible under HTTPS as it would\nconstitute a man-in-the-middle attack.</p></li>\n<li><p>Situs jaringan Django anda mungkin duduk dibelakang <em>cache proxy</em>, seperti Squid Web Proxy Cache (<a class=\"reference external\" href=\"http://www.squid-cache.org/\">http://www.squid-cache.org/</a>), yang cache halaman untuk penampilan. Dalam kasus ini, setiap permintaan pertama akan ditangani oleh proxy, dan itu akan dilewatkan ke aplikasi anda jika dibutuhkan.</p></li>\n<li><p>Your web browser caches pages, too. If a web page sends out the\nappropriate headers, your browser will use the local cached copy for\nsubsequent requests to that page, without even contacting the web page\nagain to see whether it has changed.</p></li>\n</ul>\n<p>Downstream caching is a nice efficiency boost, but there's a danger to it:\nMany web pages' contents differ based on authentication and a host of other\nvariables, and cache systems that blindly save pages based purely on URLs could\nexpose incorrect or sensitive data to subsequent visitors to those pages.</p>\n<p>For example, if you operate a web email system, then the contents of the\n&quot;inbox&quot; page depend on which user is logged in. If an ISP blindly cached your\nsite, then the first user who logged in through that ISP would have their\nuser-specific inbox page cached for subsequent visitors to the site. That's\nnot cool.</p>\n<p>Untungnya, HTTP menyediakan sebuah pemecahan pada masalah ini. Sejumlah kepala HTTP ada untuk memberikan petunjuk cache hilir untuk membedakan isi cache mereka bergantung pada variabel-variabel ditunjuk, dan memberitahu mekanisme cache tidak meng cache halaman tertentu. Kami akan mencari beberapa kepala ini di bagian-bagian yang mengikuti.</p>\n</section>\n<section id=\"using-vary-headers\">\n<span id=\"id18\"></span><h2>Menggunakan kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code><a class=\"heading-anchor\" href=\"#using-vary-headers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header defines which request headers a cache\nmechanism should take into account when building its cache key. For example, if\nthe contents of a web page depend on a user's language preference, the page is\nsaid to &quot;vary on language.&quot;</p>\n<p>Secara awalan, sistem cache Django membuat kunci cache nya menggunakan URL sepenuhnya-memenuhi syarat diminta -- sebagai contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;https://www.example.com/stories/2005/?order_by=author&quot;</span></code>. Ini berarti setiap permintaan ke URL itu akan menggunakan versi cache sama, tanpa memperhatikan dari perbedaan agen-pengguna seperti kue atau pilihan bahasa. Bagaimanapun, jika halaman ini menghasilkan isi berbeda berdasarkan pada beberapa perbedaan di kepala permintaan -- seperti sebuah  kue, atau sebuah bahasa, atau agen-pengguna -- anda akan butuh menggunakan kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> untuk memberitahu mekanisme cache yang keluaran halaman bergantung pada hal-hal tersebut.</p>\n<p>Untuk melakukan ini di Django, gunakan penghias tampilan <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.vary.vary_on_headers\" title=\"django.views.decorators.vary.vary_on_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_headers()</span></code></a> nyaman, seperti begitu:</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>Di kasus ini, mekanisme cache (seperti middleware cache sendiri Django) akan cache sebuah versi terpisah dari halaman untuk setiap agen-pengguna unik.</p>\n<p>The advantage to using the <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> decorator rather than manually\nsetting the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header (using something like <code class=\"docutils literal notranslate\"><span class=\"pre\">response.headers['Vary']</span> <span class=\"pre\">=</span>\n<span class=\"pre\">'user-agent'</span></code>) is that the decorator <em>adds</em> to the <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> header (which may\nalready exist), rather than setting it from scratch and potentially overriding\nanything that was already in there.</p>\n<p>Anda dapat melewatkan banyak kepala pada <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>Ini memberitahukan cache hilir untuk vary pada <em>kedua</em>, yang berarti setiap perpaduan dari agen-pengguna dan kue akan mendapatkan nilai cache nya sendiri. Sebagai contoh, sebuah permintaan dengan agen-pengguna <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> dan nilai kue <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=bar</span></code> akan dianggap berbeda dari permintaan dengan agen-pengguna <code class=\"docutils literal notranslate\"><span class=\"pre\">Mozilla</span></code> dan nilai kue <code class=\"docutils literal notranslate\"><span class=\"pre\">foo=ham</span></code>.</p>\n<p>Karena beragam pada kue adalah sangat umum, ada sebuah penghias <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.vary.vary_on_cookie\" title=\"django.views.decorators.vary.vary_on_cookie\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.decorators.vary.vary_on_cookie()</span></code></a>. Kedua tampilan ini adalah setara:</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>Kepala anda lewatkan ke <code class=\"docutils literal notranslate\"><span class=\"pre\">vary_on_headers</span></code> tidak  hal-hal sensitif; <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;User-Agent&quot;</span></code> adalah hal sama seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;user-agent&quot;</span></code>.</p>\n<p>Anda dapat juga menggunakan fungsi pembantu, <a class=\"reference internal\" href=\"/id/6.0/ref/utils/#django.utils.cache.patch_vary_headers\" title=\"django.utils.cache.patch_vary_headers\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.cache.patch_vary_headers()</span></code></a>, secara langsung. Fungsi ini menyetel, atau menambah ke, <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span> <span class=\"pre\">header</span></code>. Sebagai contoh:</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> mengambil sebuah instance <a class=\"reference internal\" href=\"/id/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> sebagai argumen pertamanya dan sebuah list/tuple dari nama-nama kepala kasus-tidak-peka sebagai argumen keduanya.</p>\n<p>Untuk informasi lebih lanjut tentang header Vary, lihat <span class=\"target\" id=\"index-5\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-12.5.5\"><strong>official Vary spec</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>Mengendalikan tembolok: Menggunakan kepala lainnya<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>Masalah lain dengan cache adalah pribadi dari data dan pertanyaan dari dimana data harus disimpan di cache urutan kebawah.</p>\n<p>A user usually faces two kinds of caches: their own browser cache (a private\ncache) and their provider's cache (a public cache). A public cache is used by\nmultiple users and controlled by someone else. This poses problems with\nsensitive data--you don't want, say, your bank account number stored in a\npublic cache. So web applications need a way to tell caches which data is\nprivate and which is public.</p>\n<p>Pemecahannya adalah menunjukkan cache halaman harus berupa &quot;private&quot;. Untuk melakukan ini di Django, gunakan penghias tampilan <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>. Contoh:</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>Penghias ini merawat dari mengirim keluar kepala HTTP sesuai dibelakang layar.</p>\n<p>Catat bahwa pengaturan kendali cache &quot;pribadi&quot; and &quot;umum&quot; adalah saling eksklusif. Penghias memastikan bahwa petunjuk &quot;umum: dipindahkan jika &quot;pribadi&quot; harus disetel (dan sebaliknya). Sebuah contoh penggunaan daro dua petunjuk akan menjadi sebuah situs blog yang menawarkan kedua masukan pribadi dan umum. Masukan umum mungkin di cache pada cache berbagi apapun. Kode berikut menggunakan <a class=\"reference internal\" href=\"/id/6.0/ref/utils/#django.utils.cache.patch_cache_control\" title=\"django.utils.cache.patch_cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">patch_cache_control()</span></code></a>, cara manual untuk merubah kepala kendali cache (itu adalah secara internal dipanggil oleh penghias <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a>):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">patch_cache_control</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.vary</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">vary_on_cookie</span>\n\n\n<span class=\"nd\">@vary_on_cookie</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">list_blog_entries_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">is_anonymous</span><span class=\"p\">:</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render_only_public_entries</span><span class=\"p\">()</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">public</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">render_private_and_public_entries</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span><span class=\"p\">)</span>\n        <span class=\"n\">patch_cache_control</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"n\">private</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>You can control downstream caches in other ways as well (see <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9111.html\"><strong>RFC 9111</strong></a> for\ndetails on HTTP caching). For example, even if you don't use Django's\nserver-side cache framework, you can still tell clients to cache a view for a\ncertain amount of time with the <span class=\"target\" id=\"index-3\"></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>\ndirective:</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>(Jika anda <em>melakukan</em> menggunakan middleware cache, itu sudah disetel <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> dengan nilai dari pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-CACHE_MIDDLEWARE_SECONDS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CACHE_MIDDLEWARE_SECONDS</span></code></a>. Dalam kasus itu, penyesuaian <code class=\"docutils literal notranslate\"><span class=\"pre\">max-age</span></code> dari penghias <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.cache_control\" title=\"django.views.decorators.cache.cache_control\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code></a> akan mengambil hak lebih tinggi, dan nilai-nlai kepala akan digabung dengan benar.)</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">Cache-Control</span></code> sah apapun menangganpi petunjuk adalah sah di <code class=\"docutils literal notranslate\"><span class=\"pre\">cache_control()</span></code>. Ini adalah beberapa contoh lebih:</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>Daftar penuh dari arahan dikenal dapat ditemukan di <a class=\"reference external\" href=\"https://www.iana.org/assignments/http-cache-directives/http-cache-directives.xhtml\">IANA registry</a> (catat bahwa tidak semua dari mereka memberlakukan terhadap tanggapan).</p>\n<p>Jika anda ingin menggunakan kepala untuk meniadakan cache sama sekali, <a class=\"reference internal\" href=\"/id/6.0/topics/http/decorators/#django.views.decorators.cache.never_cache\" title=\"django.views.decorators.cache.never_cache\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">never_cache()</span></code></a> adalah tampilan penghias yang menambahkan kepala-kepala untuk memastikan tanggapan tidak akan di cache oleh peramban atau cache lain. Contoh:</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>urutan dari <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>Jika anda menggunakan middleware cache, itu adalah penting untuk menaruh setiap setengah di tempat kanan dalam pengaturan <a class=\"reference internal\" href=\"/id/6.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, Itu karena middleware cache butuh mengetahui kepala-kepala mana yang digunakan oleh cary pentimpan cache. Middleware selau menambahkan sesuatu ke kepala tanggapan <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code> ketika itu dapat.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> berjalan selama fase tanggapan, dimana middleware berjalan di membalikkan urutan, jadi sebuah barang pada teratas dari daftar menjalankan <em>terakhir</em> selama fase tanggapan. Dengan demikian, anda butuh memastikan bahwa <code class=\"docutils literal notranslate\"><span class=\"pre\">UpdateCacheMiddleware</span></code> muncul <em>sebelum</em> middleware lain apapun yang mungkin menambahkan sesuatu ke kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">Vary</span></code>. Modul middleware berikut melakukannya:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code> menambah <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> menambah <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> menambah <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>, di sisi lain, berjalan selama fase permintaan, dimana middleware diberlakukan pertama-ke-terakhir, jadi sebuah barang pada teratas dari daftar berjalan <em>pertama</em> selama fase permintaan. <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> juga butuh menjalankan setelah middleware lain memperbaharui kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">vary</span></code>, jadi <code class=\"docutils literal notranslate\"><span class=\"pre\">FetchFromCacheMiddleware</span></code> harus berupa <em>setelah</em> barang apapun yang melakukannya.</p>\n</section>","rootId":"django-s-cache-framework","toc":[{"title":"Mengatur tembolok","anchor":"setting-up-the-cache","children":[{"title":"Memcache","anchor":"memcached","children":[]},{"title":"Redis","anchor":"redis","children":[]},{"title":"Menembolok basisdata","anchor":"database-caching","children":[{"title":"Membuat tabel tembolok","anchor":"creating-the-cache-table","children":[]},{"title":"Basisdata banyak","anchor":"multiple-databases","children":[]}]},{"title":"Cache sistem berkas","anchor":"filesystem-caching","children":[]},{"title":"Cache memori-lokal","anchor":"local-memory-caching","children":[]},{"title":"Cache tiruan (untuk pengembangan)","anchor":"dummy-caching-for-development","children":[]},{"title":"Menggunakan backend cache penyesuaian","anchor":"using-a-custom-cache-backend","children":[]},{"title":"Argumen cache","anchor":"cache-arguments","children":[]}]},{"title":"Cache per-site","anchor":"the-per-site-cache","children":[]},{"title":"Cache per-tampilan","anchor":"the-per-view-cache","children":[{"title":"Menentukan cache per-tampilan di URLconf","anchor":"specifying-per-view-cache-in-the-urlconf","children":[]}]},{"title":"Cache bgian cetakan","anchor":"template-fragment-caching","children":[]},{"title":"API cache tingkat-bawah","anchor":"the-low-level-cache-api","children":[{"title":"Mengakses cache","anchor":"accessing-the-cache","children":[]},{"title":"Penggunaan dasar","anchor":"basic-usage","children":[]},{"title":"Awalan kunci cache","anchor":"cache-key-prefixing","children":[]},{"title":"Memversikan cache","anchor":"cache-versioning","children":[]},{"title":"Perubahan kunci cache","anchor":"cache-key-transformation","children":[]},{"title":"Peringatan kunci cache","anchor":"cache-key-warnings","children":[]}]},{"title":"Dukungan asinkronus","anchor":"asynchronous-support","children":[]},{"title":"Cache hilir","anchor":"downstream-caches","children":[]},{"title":"Menggunakan kepala Vary","anchor":"using-vary-headers","children":[]},{"title":"Mengendalikan tembolok: Menggunakan kepala lainnya","anchor":"controlling-cache-using-other-headers","children":[]},{"title":"urutan dari MIDDLEWARE","anchor":"order-of-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/6.0/topics/"}],"prev":{"docname":"topics/auth/customizing","title":"Mengkostumisasi autentikasi di Django","url":"/id/6.0/topics/auth/customizing/"},"next":{"docname":"topics/conditional-view-processing","title":"Pengolahan Tampilan Bersyarat","url":"/id/6.0/topics/conditional-view-processing/"},"formats":{"html":"/id/6.0/topics/cache/","markdown":"/id/6.0/topics/cache.md","json":"/id/6.0/topics/cache.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/cache.txt","official":"https://docs.djangoproject.com/id/6.0/topics/cache/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}