2012-03-21 20 views
1

時には、djangoのシグナルが2回トリガーされます。ドキュメントでは、(ユニークな)dispatch_uidを作成する良い方法は、モジュール[1]のパスまたは名前か、ハッシュ可能なオブジェクト[2]のどちらかのidであると言います。djangoシグナル。一意のディスパッチIDを作成する方法は?

今日、私はこの試みた:私は、マルチユーザー環境での(ウェブサイトの場合のように)それが怖いしかし

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

を。これは壊れているかもしれません。マルチユーザ環境でこのようなIDを作成するための、安全で安全な方法は何ですか?ディスパッチIDが動作しないので

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

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

答えて

10

ように、モジュールに文字列を使用します。問題は、あなたの環境がマルチユーザであるかどうかではありません。信号を接続するコードが複数回インポートされるかどうかです。

モジュールが2回、5秒間隔でインポートされたとします。あなたは事実上次のことをしました。

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

信号が異なるディスパッチIDで2回接続されています。モジュールがproject.my_app.modulemy_app.moduleとしてインポートされることが多いので、Django 1.3以前のこのデフォルトのプロジェクト構造は、この二重インポートを可能にします。

のようにDmitryが示唆しているように、モジュールを2回目にインポートすると、ディスパッチIDが変更されていないため、シグナルは2回接続されません。同じディスパッチIDを再利用して、同じ信号で異なるコールバック関数を登録するのはあなた次第です。

6

ちょうど時間を使用'apps.models.signal_name'

+0

大丈夫、愚かな質問。どのようにこれはユニークなことができますか? – xpanta

+2

シグナルハンドラごとに一意である必要があります。 –

関連する問題