2009-09-25 4 views
17

私はDjangoシグナルを扱っていますが、一度放出されても2回受信されるようです。ここで私は(それはジャンゴでUploadifyを使用するための単純なラッパーです)で働いていたコード...Django信号は一度発光し、2回受信しました - なぜですか?

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

(私は気づいた私の信号が間違って綴られる)

私はあなた確信しているのですそこの印刷文に気づいた。コンソールで、これは展示内容です:

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

+2

POSTログラインは後に来る理由のために、私は信じていたようサーバは要求が終了するまで待機してログに記録します。その後、500のステータスコードと成功したリクエストを返すサーバエラーがあるかどうかを知ることができます。 – dcrosta

答えて

21

これは前に私に起こった(また、奇数は信号が発射された後、なぜDjangoはページのPOSTを報告しないのですか?)、それはによるものでしたインポートする信号を2回接続しているモジュール。信号が二回接続されていないあなたがdispatch_uidを設定できることを確認するには:

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

UPDATE それは実際にここに文書化されていますhttp://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

非常に役に立ちました!ありがとうございました。 –

+1

公式リンク:http://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals – Paolo

+2

文字列の内容を決定するベストプラクティスはありますか?問題を解決するために任意の文字列を追加することは...任意です。 – MrOodles

関連する問題