Django 恰好内置了一个Signals系统,它对于我正在从事的项目非常有用。
我一直在阅读 Pyramid 文档,它似乎确实有一个与信号密切相关的事件系统,但并不完全。像这样的东西适用于通用信号系统还是我应该自己推出?
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 中那样)。