7

DjangoにはSignalsシステムが組み込まれているので、私が取り組んでいるプロジェクトには非常に役立ちます。

Pyramidのドキュメントを読んでいますが、Signalsと非常に密接に関連しているEventsシステムがあるようですが、完全ではありません。このようなものは汎用信号システムで機能しますか、それとも自分でロールする必要がありますか?

4

1 に答える 1

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))

これにより、登録したすべてのサブスクライバーにリクエストが送信されます。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_robustDjangoの場合のように)。

于 2012-06-24T09:27:26.230 に答える