{"title":"Skriva synpunkter","version":"6.0","locale":"sv","docname":"topics/http/views","url":"/sv/6.0/topics/http/views/","canonical":"https://djangodocs.dev/sv/6.0/topics/http/views/","summary":"En view-funktion, eller kort och gott view , är en Python-funktion som tar emot en webbförfrågan och returnerar ett webbsvar. Detta svar kan vara HTML-innehållet på…","html":"<h1>Skriva synpunkter<a class=\"heading-anchor\" href=\"#writing-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>En view-funktion, eller kort och gott <em>view</em>, är en Python-funktion som tar emot en webbförfrågan och returnerar ett webbsvar. Detta svar kan vara HTML-innehållet på en webbsida, eller en omdirigering, eller ett 404-fel, eller ett XML-dokument, eller en bild … eller vad som helst, egentligen. Själva vyn innehåller den godtyckliga logik som krävs för att returnera svaret. Denna kod kan leva var du vill, så länge den finns på din Python-sökväg. Det finns inga andra krav - ingen ”magi”, så att säga. För att lägga koden <em>någonstans</em> är konventionen att lägga vyer i en fil som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code>, placerad i din projekt- eller applikationskatalog.</p>\n<section id=\"a-simple-view\">\n<h2>En enkel vy<a class=\"heading-anchor\" href=\"#a-simple-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Här är en vy som returnerar aktuellt datum och tid, som ett HTML-dokument:</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.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">datetime</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">current_datetime</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">now</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=\"n\">html</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&lt;html lang=&quot;en&quot;&gt;&lt;body&gt;It is now </span><span class=\"si\">%s</span><span class=\"s1\">.&lt;/body&gt;&lt;/html&gt;&#39;</span> <span class=\"o\">%</span> <span class=\"n\">now</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">html</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Låt oss gå igenom koden en rad i taget:</p>\n<ul>\n<li><p>Först importerar vi klassen <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> från modulen <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#module-django.http\" title=\"django.http: Classes dealing with HTTP requests and responses.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.http</span></code></a>, tillsammans med Pythons bibliotek <code class=\"docutils literal notranslate\"><span class=\"pre\">datetime</span></code>.</p></li>\n<li><p>Därefter definierar vi en funktion som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">current_datetime</span></code>. Detta är en vyfunktion. Varje view-funktion tar ett <a class=\"reference internal\" href=\"/sv/6.0/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 som sin första parameter, som vanligtvis heter <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code>.</p>\n<p>Observera att namnet på vyfunktionen inte spelar någon roll; den behöver inte namnges på ett visst sätt för att Django ska känna igen den. Vi kallar den <code class=\"docutils literal notranslate\"><span class=\"pre\">current_datetime</span></code> här, eftersom det namnet tydligt anger vad den gör.</p>\n</li>\n<li><p>Vyn returnerar ett <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt som innehåller det genererade svaret. Varje vyfunktion är ansvarig för att returnera ett <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-objekt. (Det finns undantag, men dem kommer vi till senare)</p></li>\n</ul>\n<aside class=\"admonition-django-s-time-zone admonition\">\n<p class=\"admonition-title\">Djangos tidszon</p>\n<p>Django innehåller en <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a>-inställning som standard är <code class=\"docutils literal notranslate\"><span class=\"pre\">Amerika/Chicago</span></code>. Detta är förmodligen inte där du bor, så du kanske vill ändra det i din inställningsfil.</p>\n</aside>\n</section>\n<section id=\"mapping-urls-to-views\">\n<h2>Mappning av webbadresser till vyer<a class=\"heading-anchor\" href=\"#mapping-urls-to-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sammanfattningsvis returnerar denna vyfunktion en HTML-sida som innehåller aktuellt datum och aktuell tid. Om du vill visa den här vyn på en viss URL måste du skapa en <em>URLconf</em>; se <a class=\"reference internal\" href=\"/sv/6.0/topics/http/urls/\"><span class=\"doc\">URL-distributör</span></a> för instruktioner.</p>\n</section>\n<section id=\"returning-errors\">\n<h2>Returnera fel<a class=\"heading-anchor\" href=\"#returning-errors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django tillhandahåller hjälp för att returnera HTTP-felkoder. Det finns underklasser av <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> för ett antal vanliga HTTP-statuskoder andra än 200 (vilket betyder <em>”OK”</em>). Du kan hitta den fullständiga listan över tillgängliga underklasser i <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#ref-httpresponse-subclasses\"><span class=\"std std-ref\">request/response</span></a>-dokumentationen. Returnera en instans av en av dessa underklasser istället för en normal <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> för att indikera ett fel. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span><span class=\"p\">,</span> <span class=\"n\">HttpResponseNotFound</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"k\">if</span> <span class=\"n\">foo</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponseNotFound</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;h1&gt;Page not found&lt;/h1&gt;&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;h1&gt;Page was found&lt;/h1&gt;&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Det finns inte en specialiserad underklass för varje möjlig HTTP-svarskod, eftersom många av dem inte kommer att vara så vanliga. Men som dokumenterat i <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a>-dokumentationen kan du också skicka HTTP-statuskoden till konstruktören för <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponse\" title=\"django.http.HttpResponse\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponse</span></code></a> för att skapa en returklass för vilken statuskod du vill. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># ...</span>\n\n    <span class=\"c1\"># Return a &quot;created&quot; (201) response code.</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"mi\">201</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Eftersom 404-fel är det överlägset vanligaste HTTP-felet finns det ett enklare sätt att hantera dessa fel.</p>\n<section id=\"the-http404-exception\">\n<h3>Undantaget ”Http404<a class=\"heading-anchor\" href=\"#the-http404-exception\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.http.Http404\">\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.http.</span></span><span class=\"sig-name descname\"><span class=\"pre\">Http404</span></span><a class=\"heading-anchor\" href=\"#django.http.Http404\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>När du returnerar ett fel som <a class=\"reference internal\" href=\"/sv/6.0/ref/request-response/#django.http.HttpResponseNotFound\" title=\"django.http.HttpResponseNotFound\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpResponseNotFound</span></code></a>, är du ansvarig för att definiera HTML på den resulterande felsidan:</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\">return</span> <span class=\"n\">HttpResponseNotFound</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;h1&gt;Page not found&lt;/h1&gt;&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>För enkelhetens skull, och eftersom det är en bra idé att ha en konsekvent 404-felsida på hela webbplatsen, tillhandahåller Django ett undantag för <code class=\"docutils literal notranslate\"><span class=\"pre\">Http404</span></code>. Om du höjer <code class=\"docutils literal notranslate\"><span class=\"pre\">Http404</span></code> vid någon tidpunkt i en vyfunktion, kommer Django att fånga det och returnera standardfelsidan för din applikation, tillsammans med en HTTP-felkod 404.</p>\n<p>Exempel på användning:</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.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Http404</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">polls.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Poll</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">detail</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">poll_id</span><span class=\"p\">):</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">p</span> <span class=\"o\">=</span> <span class=\"n\">Poll</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"n\">poll_id</span><span class=\"p\">)</span>\n    <span class=\"k\">except</span> <span class=\"n\">Poll</span><span class=\"o\">.</span><span class=\"n\">DoesNotExist</span><span class=\"p\">:</span>\n        <span class=\"k\">raise</span> <span class=\"n\">Http404</span><span class=\"p\">(</span><span class=\"s2\">&quot;Poll does not exist&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;polls/detail.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;poll&quot;</span><span class=\"p\">:</span> <span class=\"n\">p</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>För att visa anpassad HTML när Django returnerar en 404, kan du skapa en HTML-mall med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">404.html</span></code> och placera den på den översta nivån i ditt mallträd. Denna mall kommer sedan att visas när <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> är inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>.</p>\n<p>När <a class=\"reference internal\" href=\"/sv/6.0/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> kan du ange ett meddelande till <code class=\"docutils literal notranslate\"><span class=\"pre\">Http404</span></code> och det kommer att visas i standardmallen för 404 debug. Använd dessa meddelanden i felsökningssyfte; de är i allmänhet inte lämpliga att använda i en 404-mall för produktion.</p>\n</section>\n</section>\n<section id=\"customizing-error-views\">\n<span id=\"id1\"></span><h2>Anpassa felvyer<a class=\"heading-anchor\" href=\"#customizing-error-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Standardfelvyerna i Django bör räcka för de flesta webbapplikationer, men kan enkelt åsidosättas om du behöver något anpassat beteende. Specificera hanterarna enligt nedan i din URLconf (att ställa in dem någon annanstans har ingen effekt).</p>\n<p>Vyn <a class=\"reference internal\" href=\"/sv/6.0/ref/views/#django.views.defaults.page_not_found\" title=\"django.views.defaults.page_not_found\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">page_not_found()</span></code></a> åsidosätts av <a class=\"reference internal\" href=\"/sv/6.0/ref/urls/#django.conf.urls.handler404\" title=\"django.conf.urls.handler404\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">handler404</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\">handler404</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;mysite.views.my_custom_page_not_found_view&quot;</span>\n</code></pre></div>\n<p>Vyn <a class=\"reference internal\" href=\"/sv/6.0/ref/views/#django.views.defaults.server_error\" title=\"django.views.defaults.server_error\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">server_error()</span></code></a> åsidosätts av <a class=\"reference internal\" href=\"/sv/6.0/ref/urls/#django.conf.urls.handler500\" title=\"django.conf.urls.handler500\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">handler500</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\">handler500</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;mysite.views.my_custom_error_view&quot;</span>\n</code></pre></div>\n<p>Vyn <a class=\"reference internal\" href=\"/sv/6.0/ref/views/#django.views.defaults.permission_denied\" title=\"django.views.defaults.permission_denied\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">permission_denied()</span></code></a> åsidosätts av <a class=\"reference internal\" href=\"/sv/6.0/ref/urls/#django.conf.urls.handler403\" title=\"django.conf.urls.handler403\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">handler403</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\">handler403</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;mysite.views.my_custom_permission_denied_view&quot;</span>\n</code></pre></div>\n<p>Vyn <a class=\"reference internal\" href=\"/sv/6.0/ref/views/#django.views.defaults.bad_request\" title=\"django.views.defaults.bad_request\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">bad_request()</span></code></a> åsidosätts av <a class=\"reference internal\" href=\"/sv/6.0/ref/urls/#django.conf.urls.handler400\" title=\"django.conf.urls.handler400\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">handler400</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\">handler400</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;mysite.views.my_custom_bad_request_view&quot;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Se även</p>\n<p>Använd inställningen <a class=\"reference internal\" href=\"/sv/6.0/ref/settings/#std-setting-CSRF_FAILURE_VIEW\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CSRF_FAILURE_VIEW</span></code></a> för att åsidosätta CSRF-felvyn.</p>\n</aside>\n<section id=\"testing-custom-error-views\">\n<h3>Testa anpassade felvyer<a class=\"heading-anchor\" href=\"#testing-custom-error-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du vill testa svaret från en anpassad felhanterare kan du skapa ett lämpligt undantag i en testvy. Till exempel:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">PermissionDenied</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SimpleTestCase</span><span class=\"p\">,</span> <span class=\"n\">override_settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">path</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">response_error_handler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">exception</span><span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"s2\">&quot;Error handler content&quot;</span><span class=\"p\">,</span> <span class=\"n\">status</span><span class=\"o\">=</span><span class=\"mi\">403</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">permission_denied_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">raise</span> <span class=\"n\">PermissionDenied</span>\n\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;403/&quot;</span><span class=\"p\">,</span> <span class=\"n\">permission_denied_view</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">handler403</span> <span class=\"o\">=</span> <span class=\"n\">response_error_handler</span>\n\n\n<span class=\"c1\"># ROOT_URLCONF must specify the module that contains handler403 = ...</span>\n<span class=\"nd\">@override_settings</span><span class=\"p\">(</span><span class=\"n\">ROOT_URLCONF</span><span class=\"o\">=</span><span class=\"vm\">__name__</span><span class=\"p\">)</span>\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">CustomErrorHandlerTests</span><span class=\"p\">(</span><span class=\"n\">SimpleTestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_handler_renders_template_response</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/403/&quot;</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Make assertions on the response here. For example:</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertContains</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"p\">,</span> <span class=\"s2\">&quot;Error handler content&quot;</span><span class=\"p\">,</span> <span class=\"n\">status_code</span><span class=\"o\">=</span><span class=\"mi\">403</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"async-views\">\n<span id=\"id2\"></span><h2>Asynkrona vyer<a class=\"heading-anchor\" href=\"#async-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Förutom att vara synkrona funktioner kan vyer också vara asynkrona (”async”) funktioner, normalt definierade med Pythons <code class=\"docutils literal notranslate\"><span class=\"pre\">async</span> <span class=\"pre\">def</span></code> syntax. Django kommer automatiskt att upptäcka dessa och köra dem i ett asynkront sammanhang. Du måste dock använda en asynkron server baserad på ASGI för att få prestandafördelarna.</p>\n<p>Här är ett exempel på en asynkron vy:</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.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">async</span> <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">current_datetime</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">now</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=\"n\">html</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&lt;html lang=&quot;en&quot;&gt;&lt;body&gt;It is now </span><span class=\"si\">%s</span><span class=\"s1\">.&lt;/body&gt;&lt;/html&gt;&#39;</span> <span class=\"o\">%</span> <span class=\"n\">now</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">html</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Du kan läsa mer om Djangos async-stöd, och hur du bäst använder async-vyer, i <a class=\"reference internal\" href=\"/sv/6.0/topics/async/\"><span class=\"doc\">Asynkront stöd</span></a>.</p>\n</section>","rootId":"writing-views","toc":[{"title":"En enkel vy","anchor":"a-simple-view","children":[]},{"title":"Mappning av webbadresser till vyer","anchor":"mapping-urls-to-views","children":[]},{"title":"Returnera fel","anchor":"returning-errors","children":[{"title":"Undantaget ”Http404","anchor":"the-http404-exception","children":[]}]},{"title":"Anpassa felvyer","anchor":"customizing-error-views","children":[{"title":"Testa anpassade felvyer","anchor":"testing-custom-error-views","children":[]}]},{"title":"Asynkrona vyer","anchor":"async-views","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.0/topics/"},{"docname":"topics/http/index","title":"Hantering av HTTP-förfrågningar","url":"/sv/6.0/topics/http/"}],"prev":{"docname":"topics/http/urls","title":"URL-distributör","url":"/sv/6.0/topics/http/urls/"},"next":{"docname":"topics/http/decorators","title":"Visa dekoratörer","url":"/sv/6.0/topics/http/decorators/"},"formats":{"html":"/sv/6.0/topics/http/views/","markdown":"/sv/6.0/topics/http/views.md","json":"/sv/6.0/topics/http/views.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/http/views.txt","official":"https://docs.djangoproject.com/sv/6.0/topics/http/views/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}