2009-07-19 4 views
1

models.pyファイルにシグナルハンドラ関数を定義しました。そのファイルの末尾には、http://docs.djangoproject.com/en/dev/topics/signals/のドキュメントで推奨されているようにsignals.post_save.connect(myhandler, sender=myclass)を使用しています。django1.1テストサーバーに複数回登録された信号

しかし、私がテストサーバーを実行すると、単純なprint-statementデバッグでは、models.pyファイルが2回インポートされ、(私が知る限り)シグナルハンドラが2回登録されます。これは、すべてのアクションが2回処理されることを意味します。これは明らかに意図された動作ではありません。

モデルの確認フェーズで最初のインポートが実行されたように見えます。サーバーが最初に処理した要求でモデル自体が必要な場合は、2番目の処理が正しく実行されます。

シグナルハンドラを他の場所に登録する必要がありますか?これは1.1テストサーバーのバグですか?私は何か他のものを逃している?

答えて

4

connectメソッドのシグネチャはdispatch_uidパラメータが一意に受信機の特定のインスタンスを識別するための識別子である

def connect(self, receiver, sender=None, weak=True, dispatch_uid=None) 

あります。これは通常、文字列になりますが、ハッシュ可能なものでもかまいません。受信者がdispatch_uid属性を持つ場合、その受信者はすでにdispatch_uidの受信者が存在する場合は追加されません。

connectコールでdispatch_uidを指定すると、問題が解決するかどうかを確認できます。

+0

素晴らしい!これはまさに私が探していたものですが、それは私の問題を解決します。それはまだ私が作成するすべてのユニークなシグナルハンドラのためにこれを行う必要が少し不器用な感じですが、何が動作...私は1.1でこの動作が変更されたのだろうかと思う。 –

+0

この動作は信号が十分にサポートされていないために変更されます。あなたが必要とするほとんどのものは、 'save'をオーバーライドすることによって実行できます。 –

+1

'save 'をオーバーライドするタイミングとシグナルを使用するタイミングについては、http://stackoverflow.com/questions/170337/django-signals-vs-overriding-save-methodを参照してください。 –

関連する問題