Django: Für was genau sind Signale gut?

7

Ich habe Schwierigkeiten zu verstehen, wie Signale in meine Anwendung einfließen (und wie sie arbeiten). Dies sind drei Bereiche, von denen ich annehme, dass sie (mit meinem gegenwärtigen Wissen) gelten würden:

  1. Senden Sie XML zur Berichterstellung an einen Remote-Server (nachdem eine Transaktion abgeschlossen ist).
  2. Richten Sie ein Bild aus und laden Sie das Thumbnail in S3 hoch, nachdem ein Benutzer es hochgeladen hat.
  3. Löschen Sie alte Bilder aus S3, nachdem ein Benutzer ein Bildobjekt aus seinem Konto gelöscht hat.

Bin ich total von der Basis (ich fühle, dass ich sein könnte). Erhalte ich Signale und Multi Threading durcheinander ? Wenn ja, vergleichen sie dort ihre Bewerbung? Sind sie nur zur Entkopplung? Was ist auch damit zu tun, dass Sie sie frühzeitig instanziieren und keine lokale Funktion verwenden (weil sie Müll gesammelt bekommen)? Kann jemand darauf eingehen? Soll ich sie alle in Middleware anfordern, damit ich mir keine Sorgen machen muss?

    
orokusaki 19.01.2010, 21:26
quelle

3 Antworten

15

Django-Signale sind eine Möglichkeit, eine Aktion A als Reaktion auf ein Ereignis E auszuführen.

In einer unrealen Welt können Sie vermeiden, Signale zu verwenden, indem Sie den Code ändern, in dem das Ereignis E auftritt, und den Code anhängen, um die Aktion A auszuführen.

Das Problem ist, dass Sie dadurch Wartbarkeit, Lesbarkeit und viele andere Adjektive für die Softwareentwicklung verlieren:)

Signale ermöglichen es Ihnen, unabhängig davon, wo oder wie das Ereignis E auftritt, dasselbe zu tun, und zwar auf eine clevere Weise, die Wartbarkeit, Lesbarkeit usw. zulässt.

Ja, ich denke, dass die Aussage, Signale seien nützlich, um die Entkopplung zu ermöglichen, wirklich wahr ist.

(Sie haben auch Multi-Threading erwähnt. Wenn Sie das getan haben, weil Sie denken, dass Signale gut sind, weil sie gleichzeitig und so schnell ausgeführt werden ... Nun ... Ich weiß nicht, ob sie gleichzeitig ausgeführt werden, aber trotzdem tue ich es wirklich nicht Ich glaube, das ist der Punkt, für den die Djangosignale nützlich sind.

Ein Beispiel für eine gute Art, Signale auszunutzen, ist die Tatsache, dass wenn Sie andere Informationen zu einem Benutzer in django speichern wollen, Sie Userprofiles verwenden müssen. In diesem Fall, die Dokumentation selbst , sagen Sie das Es kann sinnvoll sein, ein Signal als Reaktion auf die Erstellung neuer Benutzer zu registrieren, um den neu erstellten Benutzern ein leeres Benutzerprofil hinzuzufügen.

    
Andrea Zilio 19.01.2010, 21:35
quelle
3

Hier ist ein Beispiel, das helfen könnte.

Angenommen, Sie müssen eine Aktion ausführen, wenn eine Modellinstanz gespeichert wird. Diese Aktion hat jedoch nichts direkt mit der Modell- oder Modellinstanz selbst zu tun. Daher ist es wenig sinnvoll, den Code für Ihre Aktion in eine save () -Methode für das Modell einzufügen. Es würde unnötige Code-Kopplung und Unordnung verursachen. Stattdessen können Sie einen Signal-Handler irgendwo anders in Ihrer Anwendung (oder sogar in einer anderen Anwendung) erstellen, wo es sinnvoller ist.

    
Brian Neal 19.01.2010 21:57
quelle
1

Ich würde die Aufgaben 2 und 3 (die Bilder) mit einer asynchronen Aufgabenwarteschlange wie Sellerie

durchführen

Das ist ähnlich wie Multithreading.

    
santiagobasulto 05.10.2011 23:23
quelle

Tags und Links