Il sistema di eventi utilizzato da Pyramid soddisfa esattamente gli stessi casi d'uso del sistema Signals. La tua applicazione può definire eventi arbitrari e allegare loro gli abbonati.
Per creare un nuovo evento, definire un'interfaccia per esso:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
È quindi definire una effettiva attuazione della manifestazione:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
L'interfaccia è in realtà facoltativo, ma aiuta documentazione e rende più facile fornire più implementazioni. Quindi potresti farla franca omettendo la definizione dell'interfaccia e le parti @implementer
del tutto.
Ovunque si desideri segnalare questo evento, utilizzare il metodo registry.notify
; qui mi suppone che si abbia una richiesta a disposizione per raggiungere il Registro di sistema:
request.registry.notify(MyOwnEvent(foo, bar))
Questo ti invia la richiesta a tutti gli abbonati che hai registrato; sia con config.add_subscriper
o con pyramid.events.subscriber
:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
È inoltre possibile utilizzare l'interfaccia IMyOwnEvent
al posto della classe MyOwnEvent
e il vostro abbonato viene avvisati di tutti gli eventi che implementano l'interfaccia, non solo il vostro specifica implementazione di tale evento.
Si noti che la notifica agli abbonati non rileva mai eccezioni (come ad esempio send_robust
in Django).