Hệ thống sự kiện được sử dụng bởi Kim tự tháp hoàn thành cùng một trường hợp sử dụng giống như hệ thống Tín hiệu. Ứng dụng của bạn có thể xác định các sự kiện tùy ý và đính kèm người đăng ký với họ.
Để tạo một sự kiện mới, xác định một giao diện cho nó:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
Sau đó, bạn xác định một thực hiện thực tế của sự kiện:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
Giao diện thực sự là không bắt buộc, nhưng sẽ giúp tài liệu và giúp dễ dàng cung cấp nhiều triển khai hơn. Vì vậy, bạn có thể nhận được ngay với bỏ qua định nghĩa giao diện và @implementer
phần hoàn toàn.
Bất cứ nơi nào bạn muốn báo hiệu sự kiện này, hãy sử dụng phương thức registry.notify
; ở đây tôi giả sử bạn có một yêu cầu có sẵn để đạt được đăng ký:
request.registry.notify(MyOwnEvent(foo, bar))
Điều này sẽ gửi yêu cầu tới bất kỳ người đăng ký nào bạn đã đăng ký; hoặc với config.add_subscriper
hoặc với pyramid.events.subscriber
:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
Bạn cũng có thể sử dụng giao diện IMyOwnEvent
thay vì lớp MyOwnEvent
và thuê bao của bạn sẽ được thông báo về tất cả các sự kiện mà thực hiện giao diện, không chỉ thực hiện cụ thể của sự kiện đó.
Lưu ý rằng việc thông báo cho người đăng ký không bao giờ bắt được ngoại lệ (như send_robust
ở Django sẽ làm).