2009-09-25 12 views
17

Estoy trabajando con señales de Django, pero parecen ser recibidas dos veces, incluso si se emiten una vez. Aquí está el código que estoy trabajando (es un contenedor simple de usar Uploadify con Django) ...Señal de Django emitiendo una vez, recibida dos veces - ¿Por qué?

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

(me he dado cuenta de mi señal está mal escrito)

Estoy seguro de que notado las declaraciones impresas allí. En la consola, esto es lo que se está 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 - 

(también extraño es por qué informar Django la publicación de la página después de que las señales son despedidos?)

+2

cuanto a por qué la línea de registro POST viene después, creo que el el servidor espera hasta que finaliza la solicitud para iniciar sesión; solo entonces puede saber si hubo un error del servidor que dio como resultado un código de estado de 500 frente a una solicitud exitosa, cuánto tiempo tomó la solicitud si el formato de registro contiene eso, etc. – dcrosta

Respuesta

21

Esto me ha pasado antes y que era debido a el módulo donde está conectando la señal que se está importando dos veces. Para asegurarse de que la señal no está conectado el doble se puede establecer el dispatch_uid:

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

ACTUALIZACIÓN En realidad, es documentado aquí: http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

¡Muy útil! Gracias. –

+1

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

+2

¿Existe una mejor práctica para determinar qué cadena debería ser? Agregar una cadena arbitraria para resolver el problema parece ... arbitraria. – MrOodles

Cuestiones relacionadas