2009-07-19 3 views
1

Ich habe eine Signal-Handler-Funktion in meiner models.py-Datei definiert. Am Ende dieser Datei verwende ich signals.post_save.connect(myhandler, sender=myclass) wie in der Dokumentation unter http://docs.djangoproject.com/en/dev/topics/signals/ empfohlen.Signale registriert mehr als einmal in django1.1 testserver

Wenn ich jedoch den Testserver starte, zeigt das einfache print-statement-Debugging, dass die Datei models.py zweimal importiert wird und (soweit ich das beurteilen kann), dass mein Signalhandler zweimal registriert wird. Dies bedeutet, dass jede Aktion zweimal behandelt wird, was offensichtlich nicht das beabsichtigte Verhalten ist.

Der erste Import scheint während der Modellprüfungsphase aufzutreten, und der zweite erfolgt genau dann, wenn das Modell selbst während der ersten vom Server abgefragten Anforderung benötigt wird.

Sollte ich meine Signale Handler anderswo registrieren? Ist das ein Fehler im 1.1 Testserver? Vermisse ich etwas anderes?

Antwort

4

die Signatur für die connect Methode ist

def connect(self, receiver, sender=None, weak=True, dispatch_uid=None) 

wo der dispatch_uid Parameter eine Kennung zur eindeutigen Identifizierung eine bestimmte Instanz eines Empfängers verwendet wird. Dies wird normalerweise eine Zeichenfolge sein, obwohl es alles sein kann, was hashbar ist. Wenn Empfänger über das Attribut dispatch_uid verfügen, wird der Empfänger nicht hinzugefügt, wenn bereits ein anderer Empfänger mit diesem dispatch_uid existiert.

So können Sie einen dispatch_uid in Ihrem connect Anruf angeben, um zu sehen, ob das das Problem beseitigt.

+0

Fantastisch! das ist genau das was ich gesucht habe, es löst mein Problem. Es fühlt sich immer noch etwas unhandlich an, dies für jeden einzigartigen Signal-Handler zu tun, den ich erstelle, aber was auch immer funktioniert ... Ich frage mich, warum sich dieses Verhalten in 1.1 geändert hat. –

+0

Dieses Verhalten ändert sich, weil Signale nicht gut unterstützt werden. Fast alles, was Sie jemals brauchen, kann durch Überschreiben von 'save' erfolgen. –

+1

Siehe http://stackoverflow.com/questions/170337/django-signal-vs-overriding-save-method für eine Diskussion darüber, wann "speichern" und wann Signale verwendet werden sollen –

Verwandte Themen