DjangoにはSignalsシステムが組み込まれているので、私が取り組んでいるプロジェクトには非常に役立ちます。
Pyramidのドキュメントを読んでいますが、Signalsと非常に密接に関連しているEventsシステムがあるようですが、完全ではありません。このようなものは汎用信号システムで機能しますか、それとも自分でロールする必要がありますか?
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))
これにより、登録したすべてのサブスクライバーにリクエストが送信されます。withconfig.add_subscriper
またはwith pyramid.events.subscriber
:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
IMyOwnEvent
クラスの代わりにインターフェースを使用することもできMyOwnEvent
ます。サブスクライバーには、そのイベントの特定の実装だけでなく、インターフェースを実装するすべてのイベントが通知されます。
サブスクライバーに通知しても例外がキャッチされないことに注意してください(send_robust
Djangoの場合のように)。