{"title":"Middleware","version":"6.1","locale":"sv","docname":"topics/http/middleware","url":"/sv/6.1/topics/http/middleware/","canonical":"https://djangodocs.dev/sv/6.1/topics/http/middleware/","summary":"Middleware är ett ramverk av hooks i Djangos request/response-behandling. Det är ett lätt ”plugin”-system på låg nivå för att globalt ändra Djangos in- eller…","html":"<h1>Middleware<a class=\"heading-anchor\" href=\"#middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Middleware är ett ramverk av hooks i Djangos request/response-behandling. Det är ett lätt ”plugin”-system på låg nivå för att globalt ändra Djangos in- eller utdata.</p>\n<p>Varje middleware-komponent är ansvarig för att utföra en specifik funktion. Till exempel innehåller Django en middleware-komponent, <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a>, som associerar användare med förfrågningar med hjälp av sessioner.</p>\n<p>Detta dokument förklarar hur middleware fungerar, hur du aktiverar middleware och hur du skriver din egen middleware. Django levereras med några inbyggda middleware som du kan använda direkt ur lådan. De är dokumenterade i <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/\"><span class=\"doc\">inbyggd middleware-referens</span></a>.</p>\n<section id=\"writing-your-own-middleware\">\n<h2>Skriva din egen middleware<a class=\"heading-anchor\" href=\"#writing-your-own-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En middleware-fabrik är en callable som tar en <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> callable och returnerar en middleware. En middleware är en anropsbar som tar emot en begäran och returnerar ett svar, precis som en vy.</p>\n<p>En middleware kan skrivas som en funktion som 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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">simple_middleware</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n    <span class=\"c1\"># One-time configuration and initialization.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Code to be executed for each request before</span>\n        <span class=\"c1\"># the view (and later middleware) are called.</span>\n\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Code to be executed for each request/response after</span>\n        <span class=\"c1\"># the view is called.</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">middleware</span>\n</code></pre></div>\n<p>Eller så kan det skrivas som en klass vars instanser är anropsbara, 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=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SimpleMiddleware</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">get_response</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span>\n        <span class=\"c1\"># One-time configuration and initialization.</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Code to be executed for each request before</span>\n        <span class=\"c1\"># the view (and later middleware) are called.</span>\n\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Code to be executed for each request/response after</span>\n        <span class=\"c1\"># the view is called.</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n<p>Den <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> callable som tillhandahålls av Django kan vara den faktiska vyn (om detta är den sista listade middleware) eller det kan vara nästa middleware i kedjan. Den aktuella mellanvaran behöver inte veta eller bry sig om exakt vad den är, bara att den representerar vad som kommer härnäst.</p>\n<p>Ovanstående är en liten förenkling - den anropbara <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> för den sista middlewaren i kedjan kommer inte att vara den faktiska vyn utan snarare en omslagsmetod från hanteraren som tar hand om att tillämpa <a class=\"reference internal\" href=\"#view-middleware\"><span class=\"std std-ref\">view middleware</span></a>, anropa vyn med lämpliga URL-argument och tillämpa <a class=\"reference internal\" href=\"#template-response-middleware\"><span class=\"std std-ref\">template-response</span></a> och <a class=\"reference internal\" href=\"#exception-middleware\"><span class=\"std std-ref\">exception</span></a> middleware.</p>\n<p>Middleware kan antingen stödja endast synkrona Python (standard), endast asynkrona Python, eller båda. Se <a class=\"reference internal\" href=\"#async-middleware\"><span class=\"std std-ref\">Asynkront stöd</span></a> för detaljer om hur man annonserar vad man stödjer, och vet vilken typ av förfrågan man får.</p>\n<p>Middleware kan finnas var som helst på din Python-väg.</p>\n<section id=\"init-get-response\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">__init__(get_response)</span></code><a class=\"heading-anchor\" href=\"#init-get-response\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Middleware-fabriker måste acceptera ett <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>-argument. Du kan också initiera ett globalt tillstånd för mellanvaran. Tänk på ett par försiktighetsåtgärder:</p>\n<ul class=\"simple\">\n<li><p>Django initierar din middleware med endast <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> argumentet, så du kan inte definiera <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> som kräver några andra argument.</p></li>\n<li><p>Till skillnad från metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code> som anropas en gång per förfrågan, anropas <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> bara <em>en gång</em>, när webbservern startar.</p></li>\n</ul>\n</section>\n<section id=\"marking-middleware-as-unused\">\n<h3>Markera middleware som oanvänd<a class=\"heading-anchor\" href=\"#marking-middleware-as-unused\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det är ibland användbart att vid uppstart avgöra om en del av middleware ska användas. I dessa fall kan din middlewares <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code> metod ge upphov till <a class=\"reference internal\" href=\"/sv/6.1/ref/exceptions/#django.core.exceptions.MiddlewareNotUsed\" title=\"django.core.exceptions.MiddlewareNotUsed\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">MiddlewareNotUsed</span></code></a>. Django kommer då att ta bort den middleware från middleware-processen och logga ett debug-meddelande till loggern <a class=\"reference internal\" href=\"/sv/6.1/ref/logging/#django-request-logger\"><span class=\"std std-ref\">django.begäran</span></a> när <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n</section>\n</section>\n<section id=\"activating-middleware\">\n<h2>Aktivering av middleware<a class=\"heading-anchor\" href=\"#activating-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För att aktivera en middleware-komponent lägger du till den i listan <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> i dina Django-inställningar.</p>\n<p>I <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> representeras varje middleware-komponent av en sträng: den fullständiga Python-sökvägen till middleware-fabrikens klass- eller funktionsnamn. Här är till exempel standardvärdet som skapades av <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-startproject\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">startproject</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=\"n\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.middleware.security.SecurityMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.sessions.middleware.SessionMiddleware&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.csrf.CsrfViewMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.auth.middleware.AuthenticationMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.contrib.messages.middleware.MessageMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.clickjacking.XFrameOptionsMiddleware&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>En Django-installation kräver inte någon middleware - <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> kan vara tom om du vill - men det rekommenderas starkt att du åtminstone använder <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#django.middleware.common.CommonMiddleware\" title=\"django.middleware.common.CommonMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code></a>.</p>\n<p>Ordningen i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> är viktig eftersom ett mellanprogram kan vara beroende av andra mellanprogram. Till exempel lagrar <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#django.contrib.auth.middleware.AuthenticationMiddleware\" title=\"django.contrib.auth.middleware.AuthenticationMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AuthenticationMiddleware</span></code></a> den autentiserade användaren i sessionen; därför måste den köras efter <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#django.contrib.sessions.middleware.SessionMiddleware\" title=\"django.contrib.sessions.middleware.SessionMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code></a>. Se <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#middleware-ordering\"><span class=\"std std-ref\">Beställning av mellanprogramvara</span></a> för några vanliga tips om ordning av Django middleware-klasser.</p>\n</section>\n<section id=\"middleware-order-and-layering\">\n<h2>Ordning och skiktning av mellanprogram<a class=\"heading-anchor\" href=\"#middleware-order-and-layering\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Under förfrågningsfasen, innan vyn anropas, tillämpar Django middleware i den ordning som definieras i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, uppifrån och ner.</p>\n<p>Du kan tänka på det som en lök: varje middleware-klass är ett ”lager” som omsluter vyn, som finns i lökens kärna. Om begäran passerar genom alla lager i löken (varje lager anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> för att skicka begäran till nästa lager), hela vägen till vyn i kärnan, kommer svaret sedan att passera genom varje lager (i omvänd ordning) på väg tillbaka ut.</p>\n<p>Om ett av lagren bestämmer sig för att kortsluta och returnera ett svar utan att någonsin anropa sitt <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>, kommer inget av lagren i löken inuti det lagret (inklusive vyn) att se begäran eller svaret. Svaret kommer bara att returneras genom samma lager som begäran passerade in genom.</p>\n</section>\n<section id=\"other-middleware-hooks\">\n<h2>Andra middleware-hooks<a class=\"heading-anchor\" href=\"#other-middleware-hooks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Förutom det grundläggande request/response-mönstret för middleware som beskrivits tidigare kan du lägga till tre andra specialmetoder till klassbaserade middleware:</p>\n<section id=\"process-view\">\n<span id=\"view-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code><a class=\"heading-anchor\" href=\"#process-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_view\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_view</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_func</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_args</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">view_kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_view\"><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\">request</span></code> är ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> objekt. <code class=\"docutils literal notranslate\"><span class=\"pre\">view_func</span></code> är den Python-funktion som Django ska använda. (Det är det faktiska funktionsobjektet, inte namnet på funktionen som en sträng.) <code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> är en lista över positionella argument som kommer att skickas till vyn, och <code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> är en ordbok över nyckelordsargument som kommer att skickas till vyn. Varken <code class=\"docutils literal notranslate\"><span class=\"pre\">view_args</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">view_kwargs</span></code> inkluderar det första vyargumentet (<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> anropas precis innan Django anropar vyn.</p>\n<p>Det bör returnera antingen <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> eller ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt. Om det returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> kommer Django att fortsätta bearbeta denna begäran, köra alla andra <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> middleware och sedan den lämpliga vyn. Om det returnerar ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt kommer Django inte att bry sig om att anropa lämplig vy; det kommer att tillämpa svarsmellanprogram till det <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> och returnera resultatet.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Åtkomst till <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpRequest.POST\" title=\"django.http.HttpRequest.POST\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.POST</span></code></a> inuti middleware innan vyn körs eller i <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view()</span></code> kommer att förhindra att en vy som körs efter middleware kan <a class=\"reference internal\" href=\"/sv/6.1/topics/http/file-uploads/#modifying-upload-handlers-on-the-fly\"><span class=\"std std-ref\">modifiera uppladdningshanterarna för begäran</span></a>, och bör normalt undvikas.</p>\n<p>Klassen <a class=\"reference internal\" href=\"/sv/6.1/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CsrfViewMiddleware</span></code></a> kan betraktas som ett undantag, eftersom den tillhandahåller dekoratorerna <a class=\"reference internal\" href=\"/sv/6.1/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_exempt()</span></code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_protect()</span></code></a> som gör det möjligt för vyer att uttryckligen styra vid vilken tidpunkt CSRF-valideringen ska ske.</p>\n</aside>\n</section>\n<section id=\"process-exception\">\n<span id=\"exception-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code><a class=\"heading-anchor\" href=\"#process-exception\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_exception\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_exception</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exception</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_exception\"><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\">request</span></code> är ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> objekt. <code class=\"docutils literal notranslate\"><span class=\"pre\">exception</span></code> är ett <code class=\"docutils literal notranslate\"><span class=\"pre\">Exception</span></code> objekt som tas upp av view funktionen.</p>\n<p>Django anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> när en vy ger upphov till ett undantag. <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception()</span></code> bör returnera antingen <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> eller ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt. Om den returnerar ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt kommer mallsvaret och svarsmellanvaran att tillämpas och det resulterande svaret returneras till webbläsaren. Annars börjar <a class=\"reference internal\" href=\"/sv/6.1/ref/views/#error-views\"><span class=\"std std-ref\">standardhantering av undantag</span></a> gälla.</p>\n<p>Återigen körs middleware i omvänd ordning under svarsfasen, som inkluderar <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>. Om en undantagsmellanvara returnerar ett svar, kommer <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>-metoderna i mellanvaruklasserna ovanför den mellanvaran inte att anropas alls.</p>\n</section>\n<section id=\"process-template-response\">\n<span id=\"template-response-middleware\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code><a class=\"heading-anchor\" href=\"#process-template-response\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"process_template_response\">\n<span class=\"sig-name descname\"><span class=\"pre\">process_template_response</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">response</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#process_template_response\"><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\">request</span></code> är ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a>-objekt. <code class=\"docutils literal notranslate\"><span class=\"pre\">response</span></code> är <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a>-objektet (eller motsvarande) som returneras av en Django-vy eller av en middleware.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code> anropas strax efter att vyn har körts färdigt, om svarsinstansen har en <code class=\"docutils literal notranslate\"><span class=\"pre\">render()</span></code>-metod, vilket indikerar att det är en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> eller motsvarande.</p>\n<p>Den måste returnera ett svarsobjekt som implementerar en <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>-metod. Det kan ändra det givna <code class=\"docutils literal notranslate\"><span class=\"pre\">respons</span></code> genom att ändra <code class=\"docutils literal notranslate\"><span class=\"pre\">response.template_name</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">response.context_data</span></code>, eller så kan det skapa och returnera en helt ny <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a> eller motsvarande.</p>\n<p>Du behöver inte uttryckligen rendera svaren - svaren renderas automatiskt när alla middleware för mallsvar har anropats.</p>\n<p>Middleware körs i omvänd ordning under svarsfasen, som inkluderar <code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response()</span></code>.</p>\n</section>\n</section>\n<section id=\"dealing-with-streaming-responses\">\n<h2>Hantering av strömmande svar<a class=\"heading-anchor\" href=\"#dealing-with-streaming-responses\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Till skillnad från <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> har <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> inte attributet <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>. Som ett resultat kan middleware inte längre anta att alla svar kommer att ha ett <code class=\"docutils literal notranslate\"><span class=\"pre\">content</span></code>-attribut. Om de behöver tillgång till innehållet måste de testa för strömmande svar och justera sitt beteende i enlighet därmed:</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\">if</span> <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming</span><span class=\"p\">:</span>\n    <span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</span> <span class=\"o\">=</span> <span class=\"n\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">streaming_content</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\">content</span> <span class=\"o\">=</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">content</span><span class=\"p\">)</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">streaming_content</span></code> bör antas vara för stort för att kunna hållas i minnet. Response middleware kan omsluta det i en ny generator, men får inte konsumera det. Omslag implementeras typiskt på följande sätt:</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\">wrap_streaming_content</span><span class=\"p\">(</span><span class=\"n\">content</span><span class=\"p\">):</span>\n    <span class=\"k\">for</span> <span class=\"n\">chunk</span> <span class=\"ow\">in</span> <span class=\"n\">content</span><span class=\"p\">:</span>\n        <span class=\"k\">yield</span> <span class=\"n\">alter_content</span><span class=\"p\">(</span><span class=\"n\">chunk</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<p><a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.StreamingHttpResponse\" title=\"django.http.StreamingHttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse</span></code></a> tillåter både synkrona och asynkrona iteratorer. Inkapslingsfunktionen måste matcha. Kontrollera <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.StreamingHttpResponse.is_async\" title=\"django.http.StreamingHttpResponse.is_async\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">StreamingHttpResponse.is_async</span></code></a> om din mellanvara behöver stödja båda typerna av iteratorer.</p>\n</section>\n<section id=\"exception-handling\">\n<h2>Hantering av undantag<a class=\"heading-anchor\" href=\"#exception-handling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django konverterar automatiskt undantag som tas upp av vyn eller av middleware till ett lämpligt HTTP-svar med en felstatuskod. <a class=\"reference internal\" href=\"/sv/6.1/ref/views/#error-views\"><span class=\"std std-ref\">Vissa undantag</span></a> konverteras till 4xx-statuskoder, medan ett okänt undantag konverteras till en 500-statuskod.</p>\n<p>Denna konvertering sker före och efter varje middleware (du kan tänka på det som den tunna filmen mellan varje lager av löken), så att varje middleware alltid kan lita på att få någon form av HTTP-svar tillbaka från anropet till dess <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> callable. Middleware behöver inte oroa sig för att linda in sitt anrop till <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> i en <code class=\"docutils literal notranslate\"><span class=\"pre\">try/except</span></code> och hantera ett undantag som kan ha uppstått av en senare middleware eller vyn. Även om nästa middleware i kedjan till exempel ger upphov till ett <a class=\"reference internal\" href=\"/sv/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>-undantag, kommer din middleware inte att se det undantaget; istället får den ett <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt med en <a class=\"reference internal\" href=\"/sv/6.1/ref/request-response/#django.http.HttpResponse.status_code\" title=\"django.http.HttpResponse.status_code\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">status_code</span></code></a> på 404.</p>\n<p>Du kan sätta <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEBUG_PROPAGATE_EXCEPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG_PROPAGATE_EXCEPTIONS</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> för att hoppa över denna konvertering och sprida undantag uppåt.</p>\n</section>\n<section id=\"asynchronous-support\">\n<span id=\"async-middleware\"></span><h2>Asynkront stöd<a class=\"heading-anchor\" href=\"#asynchronous-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Middleware kan stödja alla kombinationer av synkrona och asynkrona förfrågningar. Django kommer att anpassa förfrågningar för att passa mellanvarans krav om det inte kan stödja båda, men med en prestandaförlust.</p>\n<p>Som standard antar Django att din middleware endast kan hantera synkrona förfrågningar. För att ändra dessa antaganden, ställ in följande attribut på din middleware fabriksfunktion eller klass:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sync_capable</span></code> är en boolean som anger om mellanvaran kan hantera synkrona förfrågningar. Standardvärdet är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">async_capable</span></code> är en boolean som anger om mellanvaran kan hantera asynkrona förfrågningar. Standardvärdet är <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p></li>\n</ul>\n<p>If your middleware has both <code class=\"docutils literal notranslate\"><span class=\"pre\">sync_capable</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">async_capable</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code>, then Django will pass it the request without\nconverting it. In this case, you can work out if your middleware will receive\nasync requests by checking if the <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> object you are passed is a\ncoroutine function, using <code class=\"docutils literal notranslate\"><span class=\"pre\">inspect.iscoroutinefunction</span></code>.</p>\n<p>Modulen <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.decorators</span></code> innehåller <a class=\"reference internal\" href=\"/sv/6.1/ref/utils/#django.utils.decorators.sync_only_middleware\" title=\"django.utils.decorators.sync_only_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sync_only_middleware()</span></code></a>, <a class=\"reference internal\" href=\"/sv/6.1/ref/utils/#django.utils.decorators.async_only_middleware\" title=\"django.utils.decorators.async_only_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">async_only_middleware()</span></code></a>, och <a class=\"reference internal\" href=\"/sv/6.1/ref/utils/#django.utils.decorators.sync_and_async_middleware\" title=\"django.utils.decorators.sync_and_async_middleware\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">sync_and_async_middleware()</span></code></a> decorators som låter dig tillämpa dessa flaggor på middleware-fabriksfunktioner.</p>\n<p>Den returnerade callable måste matcha sync- eller async-karaktären hos <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>-metoden. Om du har en asynkron <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code> måste du returnera en coroutine-funktion (<code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code>).</p>\n<p>metoderna <code class=\"docutils literal notranslate\"><span class=\"pre\">process_view</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">process_template_response</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code>, om de tillhandahålls, bör också anpassas för att matcha sync/async-läget. Django kommer dock att anpassa dem individuellt efter behov om du inte gör det, med en extra prestandaförlust.</p>\n<p>Här är ett exempel på hur man skapar en middleware-funktion som stöder båda:</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\">inspect</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">iscoroutinefunction</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.decorators</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sync_and_async_middleware</span>\n\n\n<span class=\"nd\">@sync_and_async_middleware</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">simple_middleware</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n    <span class=\"c1\"># One-time configuration and initialization goes here.</span>\n    <span class=\"k\">if</span> <span class=\"n\">iscoroutinefunction</span><span class=\"p\">(</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n\n        <span class=\"k\">async</span> <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n            <span class=\"c1\"># Do something here!</span>\n            <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n\n        <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">middleware</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n            <span class=\"c1\"># Do something here!</span>\n            <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n            <span class=\"k\">return</span> <span class=\"n\">response</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">middleware</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Om du deklarerar en hybrid middleware som stöder både synkrona och asynkrona anrop, kanske den typ av anrop du får inte matchar den underliggande vyn. Django kommer att optimera anropsstacken för mellanvaran för att ha så få sync/async-övergångar som möjligt.</p>\n<p>Även om du wrappar en asynkron vy kan du alltså bli anropad i synkront läge om det finns annan, synkron middleware mellan dig och vyn.</p>\n</aside>\n<p>När du använder en asynkron klassbaserad middleware måste du se till att instanser är korrekt markerade som coroutine-funktioner:</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\">inspect</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">iscoroutinefunction</span><span class=\"p\">,</span> <span class=\"n\">markcoroutinefunction</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AsyncMiddleware</span><span class=\"p\">:</span>\n    <span class=\"n\">async_capable</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n    <span class=\"n\">sync_capable</span> <span class=\"o\">=</span> <span class=\"kc\">False</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">get_response</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span> <span class=\"o\">=</span> <span class=\"n\">get_response</span>\n        <span class=\"k\">if</span> <span class=\"n\">iscoroutinefunction</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span><span class=\"p\">):</span>\n            <span class=\"n\">markcoroutinefunction</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">)</span>\n\n    <span class=\"k\">async</span> <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"k\">await</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_response</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Some logic ...</span>\n        <span class=\"k\">return</span> <span class=\"n\">response</span>\n</code></pre></div>\n</section>\n<section id=\"upgrading-pre-django-1-10-style-middleware\">\n<span id=\"upgrading-middleware\"></span><h2>Uppgradering av middleware i stil med före Django 1.10<a class=\"heading-anchor\" href=\"#upgrading-pre-django-1-10-style-middleware\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.utils.deprecation.MiddlewareMixin\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">django.utils.deprecation.</span></span><span class=\"sig-name descname\"><span class=\"pre\">MiddlewareMixin</span></span><a class=\"heading-anchor\" href=\"#django.utils.deprecation.MiddlewareMixin\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Django tillhandahåller <code class=\"docutils literal notranslate\"><span class=\"pre\">django.utils.deprecation.MiddlewareMixin</span></code> för att underlätta skapandet av middleware-klasser som är kompatibla med både <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> och den gamla <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, och som stöder synkrona och asynkrona förfrågningar. Alla middleware-klasser som ingår i Django är kompatibla med båda inställningarna.</p>\n<p>Mixinen tillhandahåller en <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__()</span></code>-metod som kräver ett <code class=\"docutils literal notranslate\"><span class=\"pre\">get_response</span></code>-argument och lagrar det i <code class=\"docutils literal notranslate\"><span class=\"pre\">self.get_response</span></code>.</p>\n<p>Metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code>:</p>\n<ol class=\"arabic simple\">\n<li><p>Anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">self.process_request(request)</span></code> (om definierat).</p></li>\n<li><p>Anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">self.get_response(request)</span></code> för att hämta svaret från senare middleware och vyn.</p></li>\n<li><p>Anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">self.process_response(request,</span> <span class=\"pre\">response)</span></code> (om definierat).</p></li>\n<li><p>Returnerar svaret.</p></li>\n</ol>\n<p>Om den används med <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code> kommer metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">__call__()</span></code> aldrig att användas; Django anropar <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response()</span></code> direkt.</p>\n<p>I de flesta fall räcker det med att ärva från denna mixin för att göra en gammal middleware kompatibel med det nya systemet med tillräcklig bakåtkompatibilitet. Den nya semantiken för kortslutning kommer att vara harmlös eller till och med fördelaktig för den befintliga mellanprogramvaran. I några få fall kan en middleware-klass behöva ändras för att anpassas till den nya semantiken.</p>\n<p>Detta är de beteendemässiga skillnaderna mellan att använda <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> och <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>:</p>\n<ol class=\"arabic simple\">\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code> kommer varje middleware alltid att få sin metod <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code> anropad, även om en tidigare middleware kortslöt genom att returnera ett svar från sin metod <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request</span></code>. Under <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> beter sig middleware mer som en lök: de lager som ett svar går igenom på vägen ut är samma lager som såg begäran på vägen in. Om en mellanvara kortsluts är det bara den mellanvaran och de före den i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> som kommer att se svaret.</p></li>\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code> tillämpas <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code> på undantag som uppstår från en <code class=\"docutils literal notranslate\"><span class=\"pre\">process_request</span></code>-metod för mellanprogramvara. Under <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> gäller <code class=\"docutils literal notranslate\"><span class=\"pre\">process_exception</span></code> endast för undantag som uppstår från vyn (eller från <code class=\"docutils literal notranslate\"><span class=\"pre\">render</span></code>-metoden i en <a class=\"reference internal\" href=\"/sv/6.1/ref/template-response/#django.template.response.TemplateResponse\" title=\"django.template.response.TemplateResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemplateResponse</span></code></a>). Undantag som tas upp från en mellanvara konverteras till lämpligt HTTP-svar och skickas sedan vidare till nästa mellanvara.</p></li>\n<li><p>Under <code class=\"docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE_CLASSES</span></code>, om en <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code>-metod ger upphov till ett undantag, hoppas <code class=\"docutils literal notranslate\"><span class=\"pre\">process_response</span></code>-metoderna för alla tidigare mellanprogram över och ett <code class=\"docutils literal notranslate\"><span class=\"pre\">500</span> <span class=\"pre\">Internal</span> <span class=\"pre\">Server</span> <span class=\"pre\">Error</span></code> HTTP-svar returneras alltid (även om undantaget som gav upphov till t.ex. var en <a class=\"reference internal\" href=\"/sv/6.1/topics/http/views/#django.http.Http404\" title=\"django.http.Http404\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Http404</span></code></a>). Under <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a>, kommer ett undantag som uppstår från en middleware omedelbart att konverteras till lämpligt HTTP-svar, och sedan kommer nästa middleware i raden att se det svaret. Mellanprogram hoppas aldrig över på grund av att ett mellanprogram ger upphov till ett undantag.</p></li>\n</ol>\n</section>","rootId":"middleware","toc":[{"title":"Skriva din egen middleware","anchor":"writing-your-own-middleware","children":[{"title":"__init__(get_response)","anchor":"init-get-response","children":[]},{"title":"Markera middleware som oanvänd","anchor":"marking-middleware-as-unused","children":[]}]},{"title":"Aktivering av middleware","anchor":"activating-middleware","children":[]},{"title":"Ordning och skiktning av mellanprogram","anchor":"middleware-order-and-layering","children":[]},{"title":"Andra middleware-hooks","anchor":"other-middleware-hooks","children":[{"title":"process_view()","anchor":"process-view","children":[]},{"title":"process_exception()","anchor":"process-exception","children":[]},{"title":"process_template_response()","anchor":"process-template-response","children":[]}]},{"title":"Hantering av strömmande svar","anchor":"dealing-with-streaming-responses","children":[]},{"title":"Hantering av undantag","anchor":"exception-handling","children":[]},{"title":"Asynkront stöd","anchor":"asynchronous-support","children":[]},{"title":"Uppgradering av middleware i stil med före Django 1.10","anchor":"upgrading-pre-django-1-10-style-middleware","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"},{"docname":"topics/http/index","title":"Hantering av HTTP-förfrågningar","url":"/sv/6.1/topics/http/"}],"prev":{"docname":"topics/http/generic-views","title":"Generiska åsikter","url":"/sv/6.1/topics/http/generic-views/"},"next":{"docname":"topics/http/sessions","title":"Hur man använder sessioner","url":"/sv/6.1/topics/http/sessions/"},"formats":{"html":"/sv/6.1/topics/http/middleware/","markdown":"/sv/6.1/topics/http/middleware.md","json":"/sv/6.1/topics/http/middleware.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/http/middleware.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/http/middleware/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}