2009-09-25 42 views
17

我正在使用Django的信號,但他們似乎收到兩次,即使發射一次。下面是我的工作(這是一個簡單的包裝使用Uploadify使用Django)的代碼...Django信號發射一次,接收兩次 - 爲什麼?

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

(亦奇是爲什麼Django的報告頁面POST的信號被解僱後?)

+2

至於爲什麼POST日誌行來後,我相信服務器一直等到請求完成記錄爲止 - 只有這樣才能知道是否存在導致500狀態碼與成功請求相關的服務器錯誤,如果日誌格式包含該請求,請求將花費多長時間等等。 – dcrosta 2009-09-25 17:43:18

回答

21

這種情況以前也發生在我身上,這是由於連接兩次信號的模塊。爲了確保信號沒有連接兩次可以設置dispatch_uid:

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

UPDATE 它實際上是記錄在這裏:http://code.djangoproject.com/wiki/Signals#Helppost_saveseemstobeemittedtwiceforeachsave

+0

非常有幫助!謝謝。 – 2009-09-30 18:51:42

+1

官方鏈接:http://docs.djangoproject.com/zh-CN/dev/topics/signals/#preventing-duplicate-signals – Paolo 2011-04-16 15:18:56

+2

是否有確定字符串應該是什麼的最佳做法?添加一些任意字符串來解決這個問題似乎是......任意的。 – MrOodles 2012-04-05 14:45:02