2009-07-19 4 views
1

J'ai défini une fonction de gestionnaire de signal dans mon fichier models.py. Au bas de ce fichier, j'utilise signals.post_save.connect(myhandler, sender=myclass) comme recommandé dans les documents au http://docs.djangoproject.com/en/dev/topics/signals/. Cependant, lorsque je lance le serveur de test, le simple débogage des instructions d'impression montre que le fichier models.py est importé deux fois et (pour autant que je sache), cela entraîne l'enregistrement de mon gestionnaire de signaux deux fois. Cela signifie que chaque action est traitée deux fois, ce qui n'est évidemment pas le comportement voulu. La première importation semble se produire pendant la phase de vérification du modèle, et la seconde se produit lorsque le modèle lui-même est nécessaire lors de la première demande traitée par le serveur.Signaux enregistrés plusieurs fois dans django1.1 testserver

Dois-je enregistrer mes gestionnaires de signaux ailleurs? Est-ce un bug dans le serveur de test 1.1? Est-ce que je manque quelque chose d'autre?

Répondre

4

La signature de la méthode connect est

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

où le paramètre dispatch_uid est un identificateur utilisé pour identifier de manière unique une instance particulière d'un récepteur. Ce sera généralement une chaîne, mais il peut être tout ce qui est lavable. Si les récepteurs ont un attribut dispatch_uid, le récepteur ne sera pas ajouté si un autre récepteur existe déjà avec ce dispatch_uid. Par conséquent, vous pouvez spécifier un dispatch_uid dans votre appel connect pour voir si cela élimine le problème.

+0

Fantastique! c'est exactement ce que je cherchais, ça résout mon problème. Il me semble toujours un peu maladroit d'avoir à le faire pour chaque gestionnaire de signal unique que je crée, mais tout ce qui fonctionne ... Je me demande pourquoi ce comportement a changé en 1.1. –

+0

Ce comportement change car les signaux ne sont pas correctement pris en charge. Presque tout ce dont vous avez besoin peut être fait en remplaçant 'save'. –

+1

Voir http://stackoverflow.com/questions/170337/django-signals-vs-overriding-save-method pour une discussion sur le moment de surcharger 'save' et quand utiliser les signaux –

Questions connexes