{"title":"Pengolahan Tampilan Bersyarat","version":"4.0","locale":"id","docname":"topics/conditional-view-processing","url":"/id/4.0/topics/conditional-view-processing/","canonical":"https://djangodocs.dev/id/4.0/topics/conditional-view-processing/","summary":"HTTP clients can send a number of headers to tell the server about copies of a resource that they have already seen. This is commonly used when retrieving a web…","html":"<h1>Pengolahan Tampilan Bersyarat<a class=\"heading-anchor\" href=\"#conditional-view-processing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>HTTP clients can send a number of headers to tell the server about copies of a\nresource that they have already seen. This is commonly used when retrieving a\nweb page (using an HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> request) to avoid sending all the data for\nsomething the client has already retrieved. However, the same headers can be\nused for all HTTP methods (<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code>, etc.).</p>\n<p>Untuk setiap halaman (tanggapan) yang Django kirim kembali dari tampilan, itu mungkin menyediakan dua kepala HTTP: kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code>. Kepala-kepala ini pilihan pada tanggapan HTTP. Mereka dapat disetel dengan fungsi tampilan anda, anda dapat bergantung pada middleware <a class=\"reference internal\" href=\"/id/4.0/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConditionalGetMiddleware</span></code></a> untuk menyetel kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code>.</p>\n<p>When the client next requests the same resource, it might send along a header\nsuch as either <span class=\"target\" id=\"index-0\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-3.3\"><strong>If-modified-since</strong></a> or\n<span class=\"target\" id=\"index-1\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-3.4\"><strong>If-unmodified-since</strong></a>, containing the date of the last\nmodification time it was sent, or either <span class=\"target\" id=\"index-2\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-3.1\"><strong>If-match</strong></a> or\n<span class=\"target\" id=\"index-3\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-3.2\"><strong>If-none-match</strong></a>, containing the last <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> it was\nsent. If the current version of the page matches the <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the\nclient, or if the resource has not been modified, a 304 status code can be sent\nback, instead of a full response, telling the client that nothing has changed.\nDepending on the header, if the page has been modified or does not match the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the client, a 412 status code (Precondition Failed) may be\nreturned.</p>\n<p>Ketika anda butuh lebih kendali lebih-halus anda mungkin menggunakan fungsi pengolahan bersyarat per-tampilan.</p>\n<section id=\"the-condition-decorator\">\n<span id=\"conditional-decorators\"></span><h2>Penggias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code><a class=\"heading-anchor\" href=\"#the-condition-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sometimes (in fact, quite often) you can create functions to rapidly compute\nthe <span class=\"target\" id=\"index-4\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-2.3\"><strong>ETag</strong></a> value or the last-modified time for a\nresource, <strong>without</strong> needing to do all the computations needed to construct\nthe full view. Django can then use these functions to provide an\n&quot;early bailout&quot; option for the view processing. Telling the client that the\ncontent has not been modified since the last request, perhaps.</p>\n<p>Dua fungsi ini dilewatkan sebagai parameter pada penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.condition</span></code>. Penghias ini menggunakan dua fungsi (anda hanya butuh menyokong satu, jika anda tidak dapat menghitung kedua jumlah dengan mudah dan cepat) untuk bekerja jika kepala dalam permintaan HTTP cocok dengan itu pada sumber daya. Jika mereka tidak cocok, sebuah salinan baru dari sumber daya harus dihitung dan tampilan biasa anda dipanggil.</p>\n<p>Tanda tangan penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> 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\">condition</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"n\">last_modified_func</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>The two functions, to compute the ETag and the last modified time, will be\npassed the incoming <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> object and the same parameters, in the same\norder, as the view function they are helping to wrap. The function passed\n<code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified_func</span></code> should return a standard datetime value specifying the\nlast time the resource was modified, or <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> if the resource doesn't\nexist. The function passed to the <code class=\"docutils literal notranslate\"><span class=\"pre\">etag</span></code> decorator should return a string\nrepresenting the <span class=\"target\" id=\"index-5\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-2.3\"><strong>ETag</strong></a> for the resource, or <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>\nif it doesn't exist.</p>\n<p>Penghias menyetel kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> pada tanggapan jika mereka tidak disetel oleh tampilan dan jika metode permintaan adalah aman (<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code>).</p>\n<p>Using this feature usefully is probably best explained with an example.\nSuppose you have this pair of models, representing a small blog system:</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\">datetime</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Blog</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Entry</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">blog</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"n\">Blog</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">published</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateTimeField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</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=\"o\">...</span>\n</code></pre></div>\n<p>Jika halaman depan, menampilkan masukan blog terakhir, hanya perubahan ketika anda menambah masukan blog baru, anda dapat menghitung waktu terakhir dirubah sangat cepat. Anda butuh tanggal <code class=\"docutils literal notranslate\"><span class=\"pre\">published</span></code> terakhir untuk setiap masukan terkait dengan blog itu. Satu cara melakukan ini adalah:</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\">latest_entry</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">blog</span><span class=\"o\">=</span><span class=\"n\">blog_id</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">latest</span><span class=\"p\">(</span><span class=\"s2\">&quot;published&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">published</span>\n</code></pre></div>\n<p>Anda lalu dapat menggunakan fungsi ini untuk menyediakan pengenalan awal dari halaman tidak berubah untuk tampilan halaman depan 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.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">condition</span>\n\n<span class=\"nd\">@condition</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"o\">=</span><span class=\"n\">latest_entry</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<aside class=\"admonition-be-careful-with-the-order-of-decorators admonition\">\n<p class=\"admonition-title\">Hati-hati dengan urutan dari penghias</p>\n<p>Ketika <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code> mengembalikan tanggapan keadaan, penghias apapun dibawah itu akan dilewati dan tidak akan diberlakukan ke tanggapan. Karena itu, penghias apapun yang butuh diberlakukan ke kedua tanggapan tampilan biasa dan tanggapan keadaan harus diatas <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code>. Khususnya, <a class=\"reference internal\" href=\"/id/4.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\">vary_on_cookie()</span></code></a>, <a class=\"reference internal\" href=\"/id/4.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\">vary_on_headers()</span></code></a>, dan <a class=\"reference internal\" href=\"/id/4.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> harus datang pertama karena <span class=\"target\" id=\"index-10\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7232.html#section-4.1\"><strong>RFC 7232</strong></a> membutuhkan yang kepala mereka set hadir pada 304 tanggapan.</p>\n</aside>\n</section>\n<section id=\"shortcuts-for-only-computing-one-value\">\n<h2>Jalan pintas untuk hanya menghitung satu nilai<a class=\"heading-anchor\" href=\"#shortcuts-for-only-computing-one-value\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebagai aturan umum, jika anda dapat menyediakan fngsi untuk menghitung <em>kedua</em> ETag dan waktu perubahan terakhir, anda harus melakukannya. Anda tidak mengetahui kepala klien HTTP diberikan akan mengirim anda, jadi bersiap-siap untuk menangani keduanya, terkadang hanya satu nilai adalah mudah untuk dihitung dan Django menyediakan penghias yang menangani hanya ETag atau hanya perhitungan dirubah-terakhir.</p>\n<p>Penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.etag</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.last_modified</span></code> dilewatkan jenis sama dari fungsi seperti penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code>. Tanda tangan mereka adalah:</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\">etag</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"p\">)</span>\n<span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Kami dapat menulis contoh paling awal, yang hanya menggunakan fungsi dirubah-terakhir, menggunakan satu dari penghias 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=\"nd\">@last_modified</span><span class=\"p\">(</span><span class=\"n\">latest_entry</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>...atau:</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\">front_page</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">blog_id</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n<span class=\"n\">front_page</span> <span class=\"o\">=</span> <span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"n\">latest_entry</span><span class=\"p\">)(</span><span class=\"n\">front_page</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"use-condition-when-testing-both-conditions\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">kondisi</span></code> ketika menguji kedua kondisi<a class=\"heading-anchor\" href=\"#use-condition-when-testing-both-conditions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Itu mungkin terlihat lebih baik bagi beberapa orang mencoba dan mengikat penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">etag</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified</span></code> jika anda ingin mencoba kedua prakeadaan. bagaimanapun, ini akan membawa perilaku tidak benar.</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=\"c1\"># Bad code. Don&#39;t do this!</span>\n<span class=\"nd\">@etag</span><span class=\"p\">(</span><span class=\"n\">etag_func</span><span class=\"p\">)</span>\n<span class=\"nd\">@last_modified</span><span class=\"p\">(</span><span class=\"n\">last_modified_func</span><span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n<span class=\"c1\"># End of bad code.</span>\n</code></pre></div>\n<p>Penghias pertama tidak mengetahui apapun tentang kedua dan mungkin menjawab tanggapan itu tidak dirubah meskipun jika penghias kedua akan menentukan sebaliknya. Penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> menggunakan kedua fugnsi callback secara terus menerus untuk bekerja tindakan tepat diambil.</p>\n</section>\n</section>\n<section id=\"using-the-decorators-with-other-http-methods\">\n<h2>Menggunakan penghias dengan metode HTTP lain<a class=\"heading-anchor\" href=\"#using-the-decorators-with-other-http-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> berguna untuk lebih dari hanya permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> (permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> adalah sama seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> dalam keadaan ini). Itu dapat juga digunakan untuk menyediakan pemeriksaan untuk perintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code>. Dalam keadaan ini, ide bukan mengembalikan sebuah tanggapan &quot;not modified&quot;, tetapi memberitahu klien yang sumber daya mereka sedang mencoba telah dirubah dalam sementara itu.</p>\n<p>Sebagai contoh, pertimbangkan pertukaran berikut diantara klien dan peladen:</p>\n<ol class=\"arabic simple\">\n<li><p>Permintaan klien <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code>.</p></li>\n<li><p>Tanggapan peladen dengan beberapa isi dengan sebuah ETag dari <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;abcd1234&quot;</span></code>.</p></li>\n<li><p>Klien mengirim sebuah permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> HTTP pada <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code> untuk memperbaharui sumber daya. Itu juga mengirim sebuah kepala <code class=\"docutils literal notranslate\"><span class=\"pre\">If-Match:</span> <span class=\"pre\">&quot;abcd1234&quot;</span></code> untuk menentukan versi itu coba memperbaharui.</p></li>\n<li><p>Peladen memeriksa untuk melihat jika sumber daya telah berubah, dengan menghitung ETag cara sama itu lakukan untuk permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> (menggunakan fungsi sama). Jika sumber data <em>telah</em> berubah, itu akan mengembalikan kode keadaan 412, berarti &quot;Prasyarat gagal&quot;.</p></li>\n<li><p>Klien mengirim sebuah permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> pada <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code>, setelah menerima tanggapan 412, untuk mengambil sebuah versi terperbaharui dari isi sebelum memperbaharui itu.</p></li>\n</ol>\n<p>Hal terpenting contoh ini menunjukkan bahwa fungsi sama dapat digunakan untuk menghitung ETAg dan nilai perubahan terakhir dalam semua keadaan. Faktanya, anda <em>harus</em> menggunakan fungsi sama, sehingga nilai sama dikembalikan setiap waktu.</p>\n<aside class=\"admonition-validator-headers-with-non-safe-request-methods admonition\">\n<p class=\"admonition-title\">Kepala-kepala pengesah dengan metode permintaan tidak-aman</p>\n<p>Penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> hanya menyetel kepala-kepala pengesah (<code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code>) untuk metode-metode HTTP aman, yaitu <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code>. Jika anda berharap mengembalikan mereka di kasus lain, setel mereka dalam tampilan anda. Lihat <span class=\"target\" id=\"index-11\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc7231.html#section-4.3.4\"><strong>RFC 7231 Section 4.3.4</strong></a> untuk mempelajari tentang perbedaan diantara menyetel sebuah kepala pengesah dalam tanggapan pada permintaan dibuat dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> lawan <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>.</p>\n</aside>\n</section>\n<section id=\"comparison-with-middleware-conditional-processing\">\n<h2>Perbandingan dengan pengolahan bersyarat middleware<a class=\"heading-anchor\" href=\"#comparison-with-middleware-conditional-processing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django provides conditional <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> handling via\n<a class=\"reference internal\" href=\"/id/4.0/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.http.ConditionalGetMiddleware</span></code></a>. While being suitable\nfor many situations, the middleware has limitations for advanced usage:</p>\n<ul class=\"simple\">\n<li><p>Itu diberlakukan secara global pada semua tampilan dalam proyek anda.</p></li>\n<li><p>Itu tidak menyimpan anda dari membangkitkan tanggapan, yang mungkin mahal.</p></li>\n<li><p>Itu hanya sesuai untuk permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> HTTP.</p></li>\n</ul>\n<p>Anda harus memilih alat paling sesuai untuk masalah tertentu anda disini. Jika anda mempunyai cara menghitung ETags dan waktu perubahan sangat cepat dan jika beberapa tampilan perlu waktu untuk membangkitkan isi, anda harus mempertimbangkan menggunakan penghias <code class=\"docutils literal notranslate\"><span class=\"pre\">decorator</span></code> digambarkan dalam dokumen ini. Jika semuanya sudah berjalan cukup cepat, lekatkan menggunakan middleware dan sejumlah lalu lintas jaringan dikirim kembali ke klien akan masih dikurangi jika tampilan belum berubah.</p>\n</section>","rootId":"conditional-view-processing","toc":[{"title":"Penggias condition","anchor":"the-condition-decorator","children":[]},{"title":"Jalan pintas untuk hanya menghitung satu nilai","anchor":"shortcuts-for-only-computing-one-value","children":[{"title":"Gunakan kondisi ketika menguji kedua kondisi","anchor":"use-condition-when-testing-both-conditions","children":[]}]},{"title":"Menggunakan penghias dengan metode HTTP lain","anchor":"using-the-decorators-with-other-http-methods","children":[]},{"title":"Perbandingan dengan pengolahan bersyarat middleware","anchor":"comparison-with-middleware-conditional-processing","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/4.0/topics/"}],"prev":{"docname":"topics/cache","title":"Kerangka kerja penyimpanan Django","url":"/id/4.0/topics/cache/"},"next":{"docname":"topics/signing","title":"Penandatanganan Kriptrograpi","url":"/id/4.0/topics/signing/"},"formats":{"html":"/id/4.0/topics/conditional-view-processing/","markdown":"/id/4.0/topics/conditional-view-processing.md","json":"/id/4.0/topics/conditional-view-processing.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/topics/conditional-view-processing.txt","official":"https://docs.djangoproject.com/id/4.0/topics/conditional-view-processing/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}