{"title":"Behandling av villkorlig vy","version":"6.0","locale":"sv","docname":"topics/conditional-view-processing","url":"/sv/6.0/topics/conditional-view-processing/","canonical":"https://djangodocs.dev/sv/6.0/topics/conditional-view-processing/","summary":"HTTP-klienter kan skicka ett antal rubriker för att berätta för servern om kopior av en resurs som de redan har sett. Detta används ofta när man hämtar en webbsida…","html":"<h1>Behandling av villkorlig vy<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-klienter kan skicka ett antal rubriker för att berätta för servern om kopior av en resurs som de redan har sett. Detta används ofta när man hämtar en webbsida (med en HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>-begäran) för att undvika att skicka alla data för något som klienten redan har hämtat. Samma rubriker kan dock användas för alla HTTP-metoder (<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>För varje sida (svar) som Django skickar tillbaka från en vy kan den tillhandahålla två HTTP-rubriker: rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> och rubriken <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code>. Dessa rubriker är valfria på HTTP-svar. De kan ställas in av din vyfunktion, eller så kan du förlita dig på <a class=\"reference internal\" href=\"/sv/6.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> middleware för att ställa in <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code>-rubriken.</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/rfc9110.html#section-13.1.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/rfc9110.html#section-13.1.4\"><strong>If-Unmodified-Since</strong></a>, containing the date of the\nlast modification 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/rfc9110.html#section-13.1.1\"><strong>If-Match</strong></a> or <span class=\"target\" id=\"index-3\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-13.1.2\"><strong>If-None-Match</strong></a>,\ncontaining the last <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> it was sent. If the current version of the page\nmatches the <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the client, or if the resource has not been\nmodified, a 304 status code can be sent back, instead of a full response,\ntelling the client that nothing has changed. Depending on the header, if the\npage has been modified or does not match the <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> sent by the client, a 412\nstatus code (Precondition Failed) may be returned.</p>\n<p>När du behöver mer finkornig kontroll kan du använda funktioner för villkorlig bearbetning per vy.</p>\n<section id=\"the-condition-decorator\">\n<span id=\"conditional-decorators\"></span><h2>Dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> (villkor)<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>Ibland (faktiskt ganska ofta) kan du skapa funktioner för att snabbt beräkna <span class=\"target\" id=\"index-12\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-8.8.3\"><strong>ETag</strong></a>-värdet eller den senast modifierade tiden för en resurs, <strong>utan</strong> att behöva göra alla beräkningar som krävs för att konstruera hela vyn. Django kan sedan använda dessa funktioner för att tillhandahålla ett ”tidigt bailout”-alternativ för vybehandlingen. Att tala om för klienten att innehållet inte har ändrats sedan den senaste begäran, kanske.</p>\n<p>Dessa två funktioner skickas som parametrar till dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.condition</span></code>. Denna dekorator använder de två funktionerna (du behöver bara tillhandahålla en, om du inte kan beräkna båda kvantiteterna enkelt och snabbt) för att räkna ut om rubrikerna i HTTP-begäran matchar dem på resursen. Om de inte matchar måste en ny kopia av resursen beräknas och din normala vy anropas.</p>\n<p>Signaturen för dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> ser ut så här:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">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>De två funktionerna, för att beräkna ETag och den senaste modifieringstiden, kommer att skickas till det inkommande <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>-objektet och samma parametrar, i samma ordning, som den vyfunktion de hjälper till att omsluta. Funktionen som skickas <code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified_func</span></code> bör returnera ett standard datetime-värde som anger den senaste gången resursen ändrades, eller <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> om resursen inte finns. Funktionen som skickas till <code class=\"docutils literal notranslate\"><span class=\"pre\">etag</span></code>-dekoratorn bör returnera en sträng som representerar <span class=\"target\" id=\"index-13\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-8.8.3\"><strong>ETag</strong></a> för resursen, eller <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> om den inte existerar.</p>\n<p>Dekoratorn ställer in rubrikerna <code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code> på svaret om de inte redan är inställda av vyn och om begärans metod är säker (<code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code>).</p>\n<p>Att använda den här funktionen på ett användbart sätt förklaras förmodligen bäst med ett exempel. Anta att du har det här paret av modeller, som representerar ett litet bloggsystem:</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\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> <span class=\"o\">...</span>\n\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>Om förstasidan, som visar de senaste blogginläggen, bara ändras när du lägger till ett nytt blogginlägg, kan du beräkna den senaste ändringstiden mycket snabbt. Du behöver det senaste <code class=\"docutils literal notranslate\"><span class=\"pre\">publicerade</span></code> datumet för varje post som är associerad med den bloggen. Ett sätt att göra detta skulle vara:</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>Du kan sedan använda den här funktionen för att tidigt upptäcka en oförändrad sida för din förstasidesvisning:</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\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> <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\">Var försiktig med beställningen av dekoratörer</p>\n<p>När <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code> returnerar ett villkorligt svar, kommer alla dekoratorer under det att hoppas över och inte gälla för svaret. Därför måste alla dekoratorer som behöver tillämpas på både det vanliga vy-svaret och ett villkorligt svar vara ovanför <code class=\"docutils literal notranslate\"><span class=\"pre\">condition()</span></code>. I synnerhet bör <a class=\"reference internal\" href=\"/sv/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\">vary_on_cookie()</span></code></a>, <a class=\"reference internal\" href=\"/sv/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\">vary_on_headers()</span></code></a> och <a class=\"reference internal\" href=\"/sv/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> komma först eftersom <span class=\"target\" id=\"index-14\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-15.4.5\"><strong>RFC 9110</strong></a> kräver att de rubriker som de anger ska finnas på 304-svar.</p>\n</aside>\n</section>\n<section id=\"shortcuts-for-only-computing-one-value\">\n<h2>Kortkommandon för att bara beräkna ett värde<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>Som en allmän regel gäller att om du kan tillhandahålla funktioner för att beräkna <em>både</em> ETag och senast ändrade tid, bör du göra det. Du vet inte vilka headers en given HTTP-klient kommer att skicka till dig, så var beredd att hantera båda. Ibland är det dock bara ett värde som är lätt att beräkna och Django tillhandahåller dekoratorer som endast hanterar ETag eller endast senast modifierade beräkningar.</p>\n<p>Dekoratorerna <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.etag</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">django.views.decorators.http.last_modified</span></code> passerar samma typ av funktioner som dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code>. Deras signaturer är:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">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>Vi kan skriva det tidigare exemplet, som bara använder en senast modifierad funktion, med hjälp av en av dessa dekoratorer:</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> <span class=\"o\">...</span>\n</code></pre></div>\n<p>…eller:</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> <span class=\"o\">...</span>\n\n\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>Använd <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> när du testar båda villkoren<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>Det kan se trevligare ut för vissa människor att försöka kedja dekoratorerna <code class=\"docutils literal notranslate\"><span class=\"pre\">etag</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">last_modified</span></code> om du vill testa båda förutsättningarna. Detta skulle dock leda till felaktigt beteende.</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> <span class=\"o\">...</span>\n\n\n<span class=\"c1\"># End of bad code.</span>\n</code></pre></div>\n<p>Den första dekoratorn vet ingenting om den andra och kan svara att svaret inte ändras även om den andra dekoratorn skulle bestämma något annat. Dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> använder båda callback-funktionerna samtidigt för att räkna ut vilken åtgärd som ska vidtas.</p>\n</section>\n</section>\n<section id=\"using-the-decorators-with-other-http-methods\">\n<h2>Använda dekoratorerna med andra HTTP-metoder<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>Dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> är användbar för mer än bara <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> förfrågningar (<code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code> förfrågningar är samma sak som <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> i denna situation). Den kan också användas för att kontrollera <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> förfrågningar. I dessa situationer är tanken inte att returnera ett ”not modified”-svar, utan att tala om för klienten att den resurs som de försöker ändra har ändrats under tiden.</p>\n<p>Tänk till exempel på följande utväxling mellan klienten och servern:</p>\n<ol class=\"arabic simple\">\n<li><p>Klienten begär <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code>.</p></li>\n<li><p>Servern svarar med en del innehåll med ETag <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;abcd1234&quot;</span></code>.</p></li>\n<li><p>Klienten skickar en HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code>-förfrågan till <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code> för att uppdatera resursen. Den skickar också en <code class=\"docutils literal notranslate\"><span class=\"pre\">If-Match:</span> <span class=\"pre\">&quot;abcd1234&quot;</span></code> header för att ange den version som den försöker uppdatera.</p></li>\n<li><p>Servern kontrollerar om resursen har ändrats genom att beräkna ETag på samma sätt som för en <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>-begäran (med samma funktion). Om resursen <em>har</em> ändrats returneras en statuskod på 412, vilket betyder att ”förvillkoret misslyckades”.</p></li>\n<li><p>Klienten skickar en <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>-förfrågan till <code class=\"docutils literal notranslate\"><span class=\"pre\">/foo/</span></code>, efter att ha fått ett 412-svar, för att hämta en uppdaterad version av innehållet innan det uppdateras.</p></li>\n</ol>\n<p>Det viktiga som exemplet visar är att samma funktioner kan användas för att beräkna ETag-värdet och värdet för senaste ändring i alla situationer. Faktum är att du <strong>bör</strong> använda samma funktioner, så att samma värden returneras varje gång.</p>\n<aside class=\"admonition-validator-headers-with-non-safe-request-methods admonition\">\n<p class=\"admonition-title\">Valideringshuvuden med osäkra förfrågningsmetoder</p>\n<p>Dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> ställer endast in valideringsrubriker (<code class=\"docutils literal notranslate\"><span class=\"pre\">ETag</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">Last-Modified</span></code>) för säkra HTTP-metoder, dvs <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">HEAD</span></code>. Om du vill returnera dem i andra fall, ställ in dem i din vy. Se <span class=\"target\" id=\"index-15\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc9110.html#section-9.3.4\"><strong>RFC 9110 Section 9.3.4</strong></a> för att lära dig mer om skillnaden mellan att ställa in en validator header som svar på förfrågningar gjorda med <code class=\"docutils literal notranslate\"><span class=\"pre\">PUT</span></code> kontra <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>Jämförelse med middleware villkorlig bearbetning<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 tillhandahåller villkorlig <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>-hantering via <a class=\"reference internal\" href=\"/sv/6.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>. Även om det är lämpligt för många situationer har mellanvaran begränsningar för avancerad användning:</p>\n<ul class=\"simple\">\n<li><p>Den tillämpas globalt på alla vyer i ditt projekt.</p></li>\n<li><p>Det innebär inte att du slipper generera svaret, vilket kan bli dyrt.</p></li>\n<li><p>Det är endast lämpligt för HTTP <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code>-förfrågningar.</p></li>\n</ul>\n<p>Här bör du välja det lämpligaste verktyget för just ditt problem. Om du har ett sätt att snabbt beräkna ETags och ändringstider och om det tar en stund för en vy att generera innehållet bör du överväga att använda dekoratorn <code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code> som beskrivs i det här dokumentet. Om allt redan går ganska snabbt kan du hålla dig till att använda mellanvaran och mängden nätverkstrafik som skickas tillbaka till klienterna kommer fortfarande att minskas om vyn inte har ändrats.</p>\n</section>","rootId":"conditional-view-processing","toc":[{"title":"Dekoratorn condition (villkor)","anchor":"the-condition-decorator","children":[]},{"title":"Kortkommandon för att bara beräkna ett värde","anchor":"shortcuts-for-only-computing-one-value","children":[{"title":"Använd condition när du testar båda villkoren","anchor":"use-condition-when-testing-both-conditions","children":[]}]},{"title":"Använda dekoratorerna med andra HTTP-metoder","anchor":"using-the-decorators-with-other-http-methods","children":[]},{"title":"Jämförelse med middleware villkorlig bearbetning","anchor":"comparison-with-middleware-conditional-processing","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"}],"prev":{"docname":"topics/cache","title":"Djangos ramverk för cache","url":"/sv/6.0/topics/cache/"},"next":{"docname":"topics/composite-primary-key","title":"Sammansatta primärnycklar","url":"/sv/6.0/topics/composite-primary-key/"},"formats":{"html":"/sv/6.0/topics/conditional-view-processing/","markdown":"/sv/6.0/topics/conditional-view-processing.md","json":"/sv/6.0/topics/conditional-view-processing.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/conditional-view-processing.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/conditional-view-processing/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}