2012-06-24 9 views
7

DjangoにはSignalsシステムが組み込まれており、私が取り組んでいるプロジェクトにとっては非常に便利です。ピラミッドにシグナル/スロットシステムがあります

私はピラミッドのドキュメントを読んできましたが、信号に非常に密接に結びついているが、それほど正確ではないEventsシステムがあるようです。このようなものは、汎用信号システムのために働くのでしょうか、それとも私は自分自身を回すべきですか?

答えて

9

Pyramidで使用されるイベントシステムは、Signalsシステムと全く同じユースケースを満たします。アプリケーションで任意のイベントを定義し、そのイベントにサブスクライバをアタッチすることができます。

そのためのインタフェースを定義し、新しいイベントを作成するには:

from zope.interface import (
    Attribute, 
    Interface, 
    ) 

class IMyOwnEvent(Interface): 
    foo = Attribute('The foo value') 
    bar = Attribute('The bar value') 

あなたは、イベントの実際の実装定義:

from zope.interface import implementer 

@implementer(IMyOwnEvent) 
class MyOwnEvent(object): 
    def __init__(self, foo, bar): 
     self.foo = foo 
     self.bar = bar 

をインターフェースは、実際にオプションですが、助け複数の実装を提供するのが容易になります。だから、インターフェースの定義と、@implementerの部分を一切省略することで逃げることができました。

このイベントを通知する場所は、registry.notifyメソッドを使用します。ここで私はあなたのレジストリを達成するために利用可能な要求を持っていると仮定します。

request.registry.notify(MyOwnEvent(foo, bar)) 

これは、あなたが登録したすべての加入者にリクエストをお送りします。 config.add_subscriperまたはpyramid.events.subscriberで次のいずれか

from pyramid.events import subscriber 
from mymodule.events import MyOwnEvent 

@subscriber(MyOwnEvent) 
def owneventsubscriber(event): 
    event.foo.spam = 'eggs' 

また、代わりにMyOwnEventクラスのIMyOwnEventインタフェースを使用することができますし、あなたの加入者は、そのイベントのあなたの特定の実装だけではなく、インタフェースを実装するすべてのイベントが通知されます。

通知者には例外が発生しません(Djangoのsend_robustなど)。

関連する問題