2009-09-25 24 views
17

Pracuję z sygnałami Django, ale wydaje się, że są odbierane dwa razy, nawet jeśli są emitowane jeden raz. Oto kod pracuję z (jest to prosty wrapper użyć Uploadify z Django) ...Sygnał Django emitujący raz, odebrany dwukrotnie - Dlaczego?

# 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) 

(Właśnie zauważyłem mój sygnał jest orkisz źle)

Jestem pewien, że zauważyłem tam instrukcje drukowania. Na konsoli, to co to jest pokazane:

(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 - 

(też dziwne jest dlaczego Django zgłoś post Strona po sygnały są opalane?)

+2

Jak, dlaczego linia dziennika POST przychodzi później, wierzę serwer czeka, aż żądanie zostanie zakończone, aby go zarejestrować - tylko wtedy będzie wiedział, czy wystąpił błąd serwera, który skutkuje kodem statusu 500 w stosunku do pomyślnego żądania, jak długo trwało żądanie, jeśli format dziennika zawiera to, itd. – dcrosta

Odpowiedz

21

To zdarzyło mi się wcześniej i to było spowodowane moduł, w którym łączysz dwukrotnie importowany sygnał. Aby upewnić się, że sygnał nie jest podłączone dwa razy można ustawić dispatch_uid:

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

UPDATE To jest rzeczywiście udokumentowany tutaj: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

Bardzo pomocna! Dziękuję Ci. –

+1

Oficjalny odsyłacz: http://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals – Paolo

+2

Czy istnieje najlepsza praktyka określania, jaki łańcuch powinien być? Dodanie dowolnego ciągu znaków w celu rozwiązania problemu wydaje się ... arbitralne. – MrOodles

Powiązane problemy