2009-09-25 6 views
17

Je travaille avec des signaux Django, mais ils semblent être reçus deux fois, même s'ils sont émis une fois. Voici le code que je travaille avec (c'est un emballage simple à utiliser Uploadify avec Django) ...Signal Django émettant une fois, reçu deux fois - Pourquoi?

# Signal-emitting code... emits whenever a file upload is received 
# ---------------------------------------------------------------- 
upload_recieved = django.dispatch.Signal(providing_args=['data']) 

def upload(request, *args, **kwargs): 
    if request.method == 'POST': 
     if request.FILES: 
      print 'sending signal' 
      upload_recieved.send(sender='uploadify', data=request.FILES['Filedata']) 
    return HttpResponse('True') 

# Signal-receiving code... 
# ----------------------------------------------------------------  
def upload_received_handler(sender, data, **kwargs): 
    print 'upload received handler' 

print 'connecting signal' 
upload_recieved.connect(upload_received_handler) 

(je viens de remarquer mon signal est mal orthographié)

Je suis sûr que vous remarqué les déclarations d'impression là-bas. Sur la console, voici ce qu'il nous montre:

(server starts) 
connecting signal 

... 

sending signal 
upload received handler 
upload received handler  # << == where is this 2nd one coming from? 
127.0.0.1 - - [25/Sep/2009 07:28:22] "POST /uploadify/upload/ HTTP/1.1" 200 - 

(aussi étrange est pourquoi rapport Django le POST page après que les signaux sont tirés?)

+2

Quant à savoir pourquoi la ligne du journal POST vient après, je crois que le le serveur attend jusqu'à ce que la requête soit terminée pour se connecter - alors seulement peut-il savoir s'il y a eu une erreur de serveur entraînant un code d'état 500 par rapport à une demande réussie, combien de temps la demande a-t-elle reçue? – dcrosta

Répondre

21

Ce qui est arrivé à moi avant et il était dû à le module où vous connectez le signal importé deux fois. Pour vous assurer que le signal ne soit pas connecté deux fois, vous pouvez régler le dispatch_uid:

upload_recieved.connect(upload_received_handler, dispatch_uid="some.unique.string.id") 

MISE À JOUR Il est en fait documenté ici: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

Très utile! Je vous remercie. –

+1

Lien officiel: http://docs.djangoproject.com/fr/dev/topics/signals/#preventing-duplicate-signals – Paolo

+2

Y at-il une meilleure pratique pour déterminer ce que la chaîne devrait être? Ajouter une chaîne arbitraire pour résoudre le problème semble ... arbitraire. – MrOodles