2012-03-21 53 views
1

有時django中的信號會被觸發兩次。在文檔中說,創建(唯一)dispatch_uid的好方法是模塊的路徑或名稱[1]或任何可哈希對象的標識[2]。Django信號。如何創建一個獨特的調度ID?

今天,我想這一點:

import time 
my_signal.connect(my_function, dispatch_uid=str(time.time())) 

但是恐怕在多用戶環境(如在一個網站的情況下)。這可能會被打破。什麼是在多用戶環境中創建這樣一個ID的好方法?

[1] https://code.djangoproject.com/wiki/Signals

[2] https://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals

回答

10

使用時間作爲調度ID將無法正常工作。問題不在於你的環境是否是多用戶的。這是連接信號的代碼是否被多次導入。

假定您的模塊被導入了兩次,間隔5秒。您已經有效地完成了以下任務。

my_signal.connect(my_function, dispatch_uid=1332407342.51) 
my_signal.connect(my_function, dispatch_uid=1332407352.51) 

您的信號已連接兩次不同的調度ID。 Django 1.3和更早版本的這個默認項目結構允許進行雙重導入,因爲模塊通常可以導入爲project.my_app.modulemy_app.module

如果您按照德米特里的建議選擇約定my_app.models.function_name,則第二次導入模塊時,信號將不會連接兩次,因爲調度ID未更改。這取決於您不要重複使用相同的調度ID來使用相同的信號註冊不同的回調函數。

6

只需使用字符串的模塊,如'apps.models.signal_name'

+0

好吧,愚蠢的問題。這怎麼可能是獨一無二的? – xpanta 2012-03-22 05:41:55

+2

它需要對每個信號處理程序都是唯一的,僅此而已 – 2012-03-22 15:44:37