{"title":"Signaler","version":"6.1","locale":"sv","docname":"topics/signals","url":"/sv/6.1/topics/signals/","canonical":"https://djangodocs.dev/sv/6.1/topics/signals/","summary":"Django innehåller en ”signal dispatcher” som hjälper frikopplade applikationer att få meddelanden när åtgärder inträffar någon annanstans i ramverket.","html":"<span id=\"signals\"></span><h1>Signaler<a class=\"heading-anchor\" href=\"#module-django.dispatch\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django innehåller en ”signal dispatcher” som hjälper frikopplade applikationer att få meddelanden när åtgärder inträffar någon annanstans i ramverket. I ett nötskal tillåter signaler vissa <em>avsändare</em> att meddela en uppsättning <em>mottagare</em> att någon åtgärd har ägt rum. De är särskilt användbara när många kodstycken kan vara intresserade av samma händelser.</p>\n<p>En tredjepartsapp kan t.ex. registrera sig för att få meddelanden om ändringar i inställningarna:</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=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> setting_changed\n\n\n<span class=\"k\">def</span> <span class=\"nf\">my_receiver</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Setting changed!&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAppConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        setting_changed<span class=\"o\">.</span>connect<span class=\"p\">(</span>my_receiver<span class=\"p\">)</span>\n</code></pre></div>\n<p>Djangos <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/\"><span class=\"doc\">inbyggda signaler</span></a> låter användarkoden få meddelande om vissa åtgärder.</p>\n<p>Du kan också definiera och skicka dina egna anpassade signaler. Se <span class=\"xref std std-ref\">definiera-och-sända-signaler</span> nedan.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Signaler ger sken av lös koppling, men de kan snabbt leda till kod som är svår att förstå, justera och felsöka.</p>\n<p>Om möjligt bör du välja att anropa hanteringskoden direkt i stället för att skicka den via en signal.</p>\n</aside>\n<section id=\"listening-to-signals\">\n<h2>Lyssna på signaler<a class=\"heading-anchor\" href=\"#listening-to-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För att ta emot en signal registrerar du en <em>mottagarfunktion</em> med metoden <a class=\"reference internal\" href=\"#django.dispatch.Signal.connect\" title=\"django.dispatch.Signal.connect\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.connect()</code></a>. Mottagarfunktionen anropas när signalen skickas. Alla signalens mottagarfunktioner anropas en i taget, i den ordning de registrerades.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.connect\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">connect</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">receiver</em>, <em class=\"sig-param\">sender<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">weak<span class=\"o\">=</span><span class=\"default_value\">True</span></em>, <em class=\"sig-param\">dispatch_uid<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.connect\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parametrar<span class=\"colon\">:</span></dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>receiver</strong> – Den callback-funktion som kommer att anslutas till denna signal. Se <a class=\"reference internal\" href=\"#receiver-functions\"><span class=\"std std-ref\">Mottagarens funktioner</span></a> för mer information.</p></li>\n<li><p><strong>sender</strong> – Anger en viss avsändare att ta emot signaler från. Se <a class=\"reference internal\" href=\"#connecting-to-specific-signals\"><span class=\"std std-ref\">Anslutning till signaler som skickas av specifika avsändare</span></a> för mer information.</p></li>\n<li><p><strong>weak</strong> – Django lagrar signalmottagare som svaga referenser som standard. Om mottagaren är en lokal funktion kan den därför skräpsamlas. För att förhindra detta skickar du <code class=\"docutils literal notranslate\">weak=False</code> när du anropar signalens metod <code class=\"docutils literal notranslate\">connect()</code>.</p></li>\n<li><p><strong>dispatch_uid</strong> – En unik identifierare för en signalmottagare i de fall där dubbla signaler kan skickas. Se <a class=\"reference internal\" href=\"#preventing-duplicate-signals\"><span class=\"std std-ref\">Förhindra dubblerade signaler</span></a> för mer information.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<p>Låt oss se hur detta fungerar genom att registrera en signal som anropas efter varje HTTP-begäran är klar. Vi kommer att ansluta till <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/#django.core.signals.request_finished\" title=\"django.core.signals.request_finished\"><code class=\"xref py py-data docutils literal notranslate\">request_finished</code></a>-signalen.</p>\n<section id=\"receiver-functions\">\n<span id=\"id1\"></span><h3>Mottagarens funktioner<a class=\"heading-anchor\" href=\"#receiver-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Först måste vi definiera en mottagarfunktion. En mottagare kan vara vilken Python-funktion eller metod som helst:</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=\"nf\">my_receiver</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Request finished!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Observera att funktionen tar ett argument <code class=\"docutils literal notranslate\">sender</code> tillsammans med jokerteckennyckelordsargument (<code class=\"docutils literal notranslate\">**kwargs</code>); alla signalmottagare måste ta dessa argument.</p>\n<p>Vi tittar på avsändare <a class=\"reference internal\" href=\"#connecting-to-specific-signals\"><span class=\"std std-ref\">lite senare</span></a>, men just nu ska du titta på argumentet <code class=\"docutils literal notranslate\">**kwargs</code>. Alla signaler skickar nyckelordsargument och kan ändra dem när som helst. För <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/#django.core.signals.request_finished\" title=\"django.core.signals.request_finished\"><code class=\"xref py py-data docutils literal notranslate\">request_finished</code></a> dokumenteras att inga argument skickas, vilket kan fresta oss att skriva vår signalhantering som <code class=\"docutils literal notranslate\">my_receiver(sender)</code>.</p>\n<p>Detta skulle vara fel - i själva verket kommer Django att kasta ett fel om du gör det. Det beror på att argument när som helst kan läggas till i signalen och din mottagare måste kunna hantera dessa nya argument.</p>\n<p>Mottagare kan också vara asynkrona funktioner, med samma signatur men deklarerade med <code class=\"docutils literal notranslate\">async def</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">async</span> <span class=\"k\">def</span> <span class=\"nf\">my_receiver</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"k\">await</span> asyncio<span class=\"o\">.</span>sleep<span class=\"p\">(</span><span class=\"mi\">5</span><span class=\"p\">)</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Request finished!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Signaler kan skickas antingen synkront eller asynkront och mottagarna kommer automatiskt att anpassas till rätt anropsstil. Se <a class=\"reference internal\" href=\"#sending-signals\"><span class=\"std std-ref\">Skicka signaler</span></a> för mer information.</p>\n</section>\n<section id=\"connecting-receiver-functions\">\n<span id=\"id2\"></span><h3>Ansluta mottagarfunktioner<a class=\"heading-anchor\" href=\"#connecting-receiver-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det finns två sätt att ansluta en mottagare till en signal. Du kan välja den manuella anslutningsvägen:</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=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> request_finished\n\nrequest_finished<span class=\"o\">.</span>connect<span class=\"p\">(</span>my_receiver<span class=\"p\">)</span>\n</code></pre></div>\n<p>Alternativt kan du använda en <a class=\"reference internal\" href=\"#django.dispatch.receiver\" title=\"django.dispatch.receiver\"><code class=\"xref py py-func docutils literal notranslate\">receiver()</code></a>-dekorator:</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.receiver\">\n<span class=\"sig-name descname\">receiver</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">signal</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.receiver\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><dl class=\"field-list simple\">\n<dt class=\"field-odd\">Parametrar<span class=\"colon\">:</span></dt>\n<dd class=\"field-odd\"><ul class=\"simple\">\n<li><p><strong>signal</strong> – En signal eller en lista med signaler att ansluta en funktion till.</p></li>\n<li><p><strong>kwargs</strong> – Argument med nyckelord med jokertecken att skicka till en <a class=\"reference internal\" href=\"#receiver-functions\"><span class=\"std std-ref\">funktion</span></a>.</p></li>\n</ul>\n</dd>\n</dl>\n</dd></dl>\n\n<p>Så här kommer du i kontakt med inredaren:</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=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> request_finished\n<span class=\"kn\">from</span> <span class=\"nn\">django.dispatch</span> <span class=\"kn\">import</span> receiver\n\n\n<span class=\"nd\">@receiver</span><span class=\"p\">(</span>request_finished<span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_receiver</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;Request finished!&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Nu anropas funktionen <code class=\"docutils literal notranslate\">my_receiver</code> varje gång en begäran avslutas.</p>\n<aside class=\"admonition-where-should-this-code-live admonition\" role=\"note\">\n<p class=\"admonition-title\">Var ska den här koden finnas?</p>\n<p>I strikt mening kan signalhanterings- och registreringskoden placeras var som helst, även om det rekommenderas att undvika applikationens rotmodul och dess <code class=\"docutils literal notranslate\">models</code>-modul för att minimera bieffekterna av importerad kod.</p>\n<p>I praktiken definieras signalmottagare normalt i en undermodul <code class=\"docutils literal notranslate\">signals</code> till den applikation de hör till. Signalmottagare ansluts i metoden <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a> i applikationens <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#configuring-applications-ref\"><span class=\"std std-ref\">konfigurationsklass</span></a>. Om du använder dekoratorn <a class=\"reference internal\" href=\"#django.dispatch.receiver\" title=\"django.dispatch.receiver\"><code class=\"xref py py-func docutils literal notranslate\">receiver()</code></a> importerar du undermodulen <code class=\"docutils literal notranslate\">signals</code> i <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a>; detta ansluter signalmottagarna implicit:</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=\"nn\">django.apps</span> <span class=\"kn\">import</span> AppConfig\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> request_finished\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyAppConfig</span><span class=\"p\">(</span>AppConfig<span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">ready</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Implicitly connect signal receivers decorated with @receiver.</span>\n        <span class=\"kn\">from</span> <span class=\"nn\">.</span> <span class=\"kn\">import</span> signals\n\n        <span class=\"c1\"># Explicitly connect a signal handler.</span>\n        request_finished<span class=\"o\">.</span>connect<span class=\"p\">(</span>signals<span class=\"o\">.</span>my_receiver<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Metoden <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a> kan köras mer än en gång under testning, så du kan vilja <a class=\"reference internal\" href=\"#preventing-duplicate-signals\"><span class=\"std std-ref\">skydda signalerna mot dubbletter</span></a> om mottagaren är en bunden metod på en instans som kan återskapas.</p>\n</aside>\n</section>\n<section id=\"connecting-to-signals-sent-by-specific-senders\">\n<span id=\"connecting-to-specific-signals\"></span><h3>Anslutning till signaler som skickas av specifika avsändare<a class=\"heading-anchor\" href=\"#connecting-to-signals-sent-by-specific-senders\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vissa signaler skickas många gånger, men du kommer bara att vara intresserad av att ta emot en viss delmängd av dessa signaler. Tänk till exempel på <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\">django.db.models.signals.pre_save</code></a>-signalen som skickas innan en modell sparas. För det mesta behöver du inte veta när <em>någon</em> modell sparas - bara när en <em>specifik</em> modell sparas.</p>\n<p>I dessa fall kan du registrera dig för att ta emot signaler som endast skickas av vissa avsändare. I fallet med <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/#django.db.models.signals.pre_save\" title=\"django.db.models.signals.pre_save\"><code class=\"xref py py-data docutils literal notranslate\">django.db.models.signals.pre_save</code></a> kommer avsändaren att vara den modellklass som sparas, så du kan ange att du bara vill ha signaler som skickas av vissa modeller:</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=\"nn\">django.db.models.signals</span> <span class=\"kn\">import</span> pre_save\n<span class=\"kn\">from</span> <span class=\"nn\">django.dispatch</span> <span class=\"kn\">import</span> receiver\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> MyModel\n\n\n<span class=\"nd\">@receiver</span><span class=\"p\">(</span>pre_save<span class=\"p\">,</span> sender<span class=\"o\">=</span>MyModel<span class=\"p\">)</span>\n<span class=\"k\">def</span> <span class=\"nf\">my_handler</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span> <span class=\"o\">...</span>\n</code></pre></div>\n<p>Funktionen <code class=\"docutils literal notranslate\">my_handler</code> anropas endast när en instans av <code class=\"docutils literal notranslate\">MyModel</code> sparas.</p>\n<p>Olika signaler använder olika objekt som sina avsändare; du måste konsultera <a class=\"reference internal\" href=\"/sv/6.1/ref/signals/\"><span class=\"doc\">inbyggd signaldokumentation</span></a> för detaljer om varje enskild signal.</p>\n</section>\n<section id=\"preventing-duplicate-signals\">\n<span id=\"id3\"></span><h3>Förhindra dubblerade signaler<a class=\"heading-anchor\" href=\"#preventing-duplicate-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När <code class=\"docutils literal notranslate\">dispatch_uid</code> inte anges identifierar Django varje mottagare med Python-objektets identitet och registrerar den bara en gång. För funktioner på modulnivå, statiska metoder och klassmetoder är identiteten stabil, så att ansluta samma mottagare mer än en gång har ingen effekt:</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=\"nf\">my_handler</span><span class=\"p\">(</span>sender<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span> <span class=\"o\">...</span>\n\n\nmy_signal<span class=\"o\">.</span>connect<span class=\"p\">(</span>my_handler<span class=\"p\">)</span>  <span class=\"c1\"># Running this code again is a no-op.</span>\n</code></pre></div>\n<p>Bundna metoder som tar ett argument <code class=\"docutils literal notranslate\">self</code> är annorlunda. Deras identitet är knuten till den specifika instansen, så att ansluta samma metod från en ny instans registrerar den som en ytterligare mottagare:</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=\"nf\">connect_signals</span><span class=\"p\">():</span>\n    backend <span class=\"o\">=</span> Backend<span class=\"p\">()</span>\n    my_signal<span class=\"o\">.</span>connect<span class=\"p\">(</span>backend<span class=\"o\">.</span>my_handler<span class=\"p\">)</span>  <span class=\"c1\"># A distinct receiver.</span>\n\n\nconnect_signals<span class=\"p\">()</span>  <span class=\"c1\"># Running this code again registers another receiver.</span>\n</code></pre></div>\n<p>När en bunden metod används som mottagare kan flera registreringar förhindras genom att ange ett unikt <code class=\"docutils literal notranslate\">dispatch_uid</code>. Identifieraren är normalt en sträng, men vilket hashbart objekt som helst räcker. Mottagaren binds till signalen endast en gång för varje unikt <code class=\"docutils literal notranslate\">dispatch_uid</code>-värde:</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=\"nn\">django.core.signals</span> <span class=\"kn\">import</span> request_finished\n\nrequest_finished<span class=\"o\">.</span>connect<span class=\"p\">(</span>my_receiver<span class=\"p\">,</span> dispatch_uid<span class=\"o\">=</span><span class=\"s2\">&quot;my_unique_identifier&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"defining-and-sending-signals\">\n<span id=\"id4\"></span><h2>Definiera och skicka signaler<a class=\"heading-anchor\" href=\"#defining-and-sending-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Dina applikationer kan dra nytta av signalinfrastrukturen och tillhandahålla sina egna signaler.</p>\n<aside class=\"admonition-when-to-use-custom-signals admonition\" role=\"note\">\n<p class=\"admonition-title\">När ska man använda anpassade signaler</p>\n<p>Signaler är implicita funktionsanrop som gör felsökningen svårare. Om sändaren och mottagaren av din anpassade signal båda finns inom ditt projekt är det bättre att använda ett explicit funktionsanrop.</p>\n</aside>\n<section id=\"defining-signals\">\n<h3>Definiera signaler<a class=\"heading-anchor\" href=\"#defining-signals\"><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.dispatch.Signal\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Signal</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Alla signaler är <a class=\"reference internal\" href=\"#django.dispatch.Signal\" title=\"django.dispatch.Signal\"><code class=\"xref py py-class docutils literal notranslate\">django.dispatch.Signal</code></a>-instanser.</p>\n<p>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\">import</span> <span class=\"nn\">django.dispatch</span>\n\npizza_done <span class=\"o\">=</span> django<span class=\"o\">.</span>dispatch<span class=\"o\">.</span>Signal<span class=\"p\">()</span>\n</code></pre></div>\n<p>Detta deklarerar en <code class=\"docutils literal notranslate\">pizza_done</code> signal.</p>\n</section>\n<section id=\"sending-signals\">\n<span id=\"id5\"></span><h3>Sänder signaler<a class=\"heading-anchor\" href=\"#sending-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Det finns två sätt att skicka signaler synkront i Django.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.send\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">send</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sender</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.send\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.send_robust\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">send_robust</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sender</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.send_robust\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Signaler kan också skickas asynkront.</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.asend\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">asend</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sender</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.asend\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.asend_robust\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">asend_robust</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">sender</em>, <em class=\"sig-param\"><span class=\"o\">**</span>kwargs</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.asend_robust\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>För att skicka en signal anropar du antingen <a class=\"reference internal\" href=\"#django.dispatch.Signal.send\" title=\"django.dispatch.Signal.send\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.send()</code></a>, <a class=\"reference internal\" href=\"#django.dispatch.Signal.send_robust\" title=\"django.dispatch.Signal.send_robust\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.send_robust()</code></a>, <a class=\"reference internal\" href=\"#django.dispatch.Signal.asend\" title=\"django.dispatch.Signal.asend\"><code class=\"xref py py-meth docutils literal notranslate\">await Signal.asend()</code></a> eller <a class=\"reference internal\" href=\"#django.dispatch.Signal.asend_robust\" title=\"django.dispatch.Signal.asend_robust\"><code class=\"xref py py-meth docutils literal notranslate\">await Signal.asend_robust()</code></a>. Du måste ange argumentet <code class=\"docutils literal notranslate\">sender</code> (som oftast är en klass) och kan ange så många andra nyckelordsargument som du vill.</p>\n<p>Så här kan det till exempel se ut när vi skickar vår signal <code class=\"docutils literal notranslate\">pizza_done</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">PizzaStore</span><span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">send_pizza</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> toppings<span class=\"p\">,</span> size<span class=\"p\">):</span>\n        pizza_done<span class=\"o\">.</span>send<span class=\"p\">(</span>sender<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"p\">,</span> toppings<span class=\"o\">=</span>toppings<span class=\"p\">,</span> size<span class=\"o\">=</span>size<span class=\"p\">)</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n<p>Alla fyra metoderna returnerar en lista med tupelpar <code class=\"docutils literal notranslate\">[(receiver, response), ...]</code>, som representerar listan över anropade mottagarfunktioner och deras svarsvärden.</p>\n<p><code class=\"docutils literal notranslate\">send()</code> skiljer sig från <code class=\"docutils literal notranslate\">send_robust()</code> i hur undantag som skapas av mottagarfunktioner hanteras. <code class=\"docutils literal notranslate\">send()</code> fångar <em>inte</em> upp några undantag som tas upp av mottagare; den tillåter helt enkelt att fel sprids. Därför kan det hända att inte alla mottagare får meddelande om en signal när det uppstår ett fel.</p>\n<p><code class=\"docutils literal notranslate\">send_robust()</code> fångar upp alla fel som härrör från Pythons klass <code class=\"docutils literal notranslate\">Exception</code> och ser till att alla mottagare meddelas om signalen. Om ett fel inträffar returneras felinstansen i tuple-paret för den mottagare som orsakade felet.</p>\n<p>Spårningarna finns i attributet <code class=\"docutils literal notranslate\">__traceback__</code> i de fel som returneras när man anropar <code class=\"docutils literal notranslate\">end_robust()</code>.</p>\n<p><code class=\"docutils literal notranslate\">asend()</code> liknar <code class=\"docutils literal notranslate\">send()</code>, men det är en coroutine som måste inväntas:</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\">async</span> <span class=\"k\">def</span> <span class=\"nf\">asend_pizza</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> toppings<span class=\"p\">,</span> size<span class=\"p\">):</span>\n    <span class=\"k\">await</span> pizza_done<span class=\"o\">.</span>asend<span class=\"p\">(</span>sender<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"vm\">__class__</span><span class=\"p\">,</span> toppings<span class=\"o\">=</span>toppings<span class=\"p\">,</span> size<span class=\"o\">=</span>size<span class=\"p\">)</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>Oavsett om de är synkrona eller asynkrona anpassas mottagare korrekt efter om <code class=\"docutils literal notranslate\">send()</code> eller <code class=\"docutils literal notranslate\">asend()</code> används. Synkrona mottagare anropas med <a class=\"reference internal\" href=\"/sv/6.1/topics/async/#asgiref.sync.sync_to_async\" title=\"asgiref.sync.sync_to_async\"><code class=\"xref py py-func docutils literal notranslate\">sync_to_async()</code></a> när de anropas via <code class=\"docutils literal notranslate\">asend()</code>. Asynkrona mottagare anropas med <a class=\"reference internal\" href=\"/sv/6.1/topics/async/#asgiref.sync.async_to_sync\" title=\"asgiref.sync.async_to_sync\"><code class=\"xref py py-func docutils literal notranslate\">async_to_sync()</code></a> när de anropas via <code class=\"docutils literal notranslate\">send()</code>. Precis som i <a class=\"reference internal\" href=\"/sv/6.1/topics/async/#async-performance\"><span class=\"std std-ref\">fallet med middleware</span></a> finns en liten prestandakostnad för att anpassa mottagare på detta sätt. För att minska antalet växlingar mellan synkrona och asynkrona anropsstilar i ett anrop till <code class=\"docutils literal notranslate\">send()</code> eller <code class=\"docutils literal notranslate\">asend()</code> grupperas mottagarna efter om de är asynkrona innan de anropas. Det innebär att en asynkron mottagare som registrerats före en synkron mottagare kan köras efter den synkrona mottagaren. Dessutom körs asynkrona mottagare parallellt med <a class=\"reference external\" href=\"https://docs.python.org/3/library/asyncio-task.html#asyncio.TaskGroup\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">asyncio.TaskGroup</code></a>.</p>\n<p>Alla inbyggda signaler, utom de som ingår i den asynkrona request-response-cykeln, skickas med <a class=\"reference internal\" href=\"#django.dispatch.Signal.send\" title=\"django.dispatch.Signal.send\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.send()</code></a>.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>I äldre versioner kördes asynkrona mottagare via <code class=\"docutils literal notranslate\">asyncio.gather()</code>.</p>\n</aside>\n</section>\n</section>\n<section id=\"disconnecting-signals\">\n<h2>Bortkoppling av signaler<a class=\"heading-anchor\" href=\"#disconnecting-signals\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.dispatch.Signal.disconnect\">\n<span class=\"sig-prename descclassname\">Signal.</span><span class=\"sig-name descname\">disconnect</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">receiver<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">sender<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">dispatch_uid<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.dispatch.Signal.disconnect\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>För att koppla bort en mottagare från en signal, anropa <a class=\"reference internal\" href=\"#django.dispatch.Signal.disconnect\" title=\"django.dispatch.Signal.disconnect\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.disconnect()</code></a>. Argumenten är de som beskrivs i <a class=\"reference internal\" href=\"#django.dispatch.Signal.connect\" title=\"django.dispatch.Signal.connect\"><code class=\"xref py py-meth docutils literal notranslate\">Signal.connect()</code></a>. Metoden returnerar <code class=\"docutils literal notranslate\">True</code> om en mottagare har kopplats bort och <code class=\"docutils literal notranslate\">False</code> om så inte är fallet. När <code class=\"docutils literal notranslate\">sender</code> skickas som en latent referens till <code class=\"docutils literal notranslate\">&lt;app label&gt;.&lt;model&gt;</code>, returnerar denna metod alltid <code class=\"docutils literal notranslate\">None</code>.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\">receiver</code> anger den registrerade mottagare som ska kopplas bort. Det kan vara <code class=\"docutils literal notranslate\">None</code> om <code class=\"docutils literal notranslate\">dispatch_uid</code> används för att identifiera mottagaren.</p>\n</section>","rootId":"module-django.dispatch","toc":[{"title":"Lyssna på signaler","anchor":"listening-to-signals","children":[{"title":"Mottagarens funktioner","anchor":"receiver-functions","children":[]},{"title":"Ansluta mottagarfunktioner","anchor":"connecting-receiver-functions","children":[]},{"title":"Anslutning till signaler som skickas av specifika avsändare","anchor":"connecting-to-signals-sent-by-specific-senders","children":[]},{"title":"Förhindra dubblerade signaler","anchor":"preventing-duplicate-signals","children":[]}]},{"title":"Definiera och skicka signaler","anchor":"defining-and-sending-signals","children":[{"title":"Definiera signaler","anchor":"defining-signals","children":[]},{"title":"Sänder signaler","anchor":"sending-signals","children":[]}]},{"title":"Bortkoppling av signaler","anchor":"disconnecting-signals","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"}],"prev":{"docname":"topics/settings","title":"Django-inställningar","url":"/sv/6.1/topics/settings/"},"next":{"docname":"topics/checks","title":"Ramverk för systemkontroll","url":"/sv/6.1/topics/checks/"},"formats":{"html":"/sv/6.1/topics/signals/","markdown":"/sv/6.1/topics/signals.md","json":"/sv/6.1/topics/signals.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/signals.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/signals/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}