2009-09-25 14 views
17

Sto lavorando con i segnali Django, ma sembrano essere ricevuti due volte, anche se emessi una volta. Ecco il codice con cui sto lavorando (si tratta di un involucro semplice da usare Uploadify con Django) ...Segnale Django che emette una volta, ricevuto due volte - Perché?

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

(ho appena notato il mio segnale è scritto sbagliato)

Sono sicuro che notato le dichiarazioni di stampa in là. Sulla console, questo è ciò che sta mostrando:

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

(anche strano è il motivo per non Django segnalare pagina POST dopo i segnali vengono licenziati?)

+2

Per quanto riguarda il motivo per cui la linea di registro POST viene dopo, credo che la il server attende fino al termine della richiesta per registrarlo, solo dopo può sapere se c'è stato un errore del server che ha generato un codice di stato 500 rispetto a una richiesta corretta, la durata della richiesta se il formato del registro lo contiene, ecc. – dcrosta

risposta

21

questo è successo a me prima ed è stato a causa di il modulo in cui si collega il segnale importato due volte. Per assicurarsi che il segnale non è collegato due volte è possibile impostare il dispatch_uid:

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

UPDATE In realtà è documentato qui: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

Molto utile! Grazie. –

+1

Link ufficiale: http://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals – Paolo

+2

Esiste una best practice per determinare quale dovrebbe essere la stringa? L'aggiunta di una stringa arbitraria per risolvere il problema sembra ... arbitraria. – MrOodles

Problemi correlati