Das von Pyramid verwendete Ereignissystem erfüllt genau die gleichen Anwendungsfälle wie das Signalsystem. Ihre Anwendung kann beliebige Ereignisse definieren und Abonnenten anhängen.
Um ein neues Ereignis zu erstellen, eine Schnittstelle für sie definieren:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
Sie dann eine tatsächliche Durchführung der Veranstaltung definieren:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
Die Schnittstelle tatsächlich optional ist, sondern hilft Dokumentation und erleichtert die Bereitstellung mehrerer Implementierungen. So können Sie die Schnittstellendefinition und @implementer
Teile weglassen.
Wenn Sie dieses Ereignis signalisieren möchten, verwenden Sie die Methode registry.notify
; hier gehe ich davon aus Sie eine Anfrage haben, die Registrierung zu erreichen:
request.registry.notify(MyOwnEvent(foo, bar))
Das wird die Anfrage an beliebige Abonnenten senden Sie angemeldet haben; entweder mit config.add_subscriper
oder mit pyramid.events.subscriber
:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
können Sie auch die IMyOwnEvent
Schnittstelle statt der MyOwnEvent
Klasse und Ihre Teilnehmer werden über alle Ereignisse informiert werden, die die Schnittstelle implementieren, nicht nur Ihre konkrete Umsetzung dieses Ereignisses.
Beachten Sie, dass die Benachrichtigung von Abonnenten niemals Ausnahmen erfasst (wie in Django send_robust
).