El sistema de eventos utilizado por Pyramid cumple exactamente los mismos casos de uso que el sistema de Señales. Su aplicación puede definir eventos arbitrarios y adjuntar suscriptores a ellos.
Para crear un nuevo evento, definir una interfaz para ello:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
A continuación se define una implementación real del evento:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
La interfaz es en realidad opcional, pero ayuda documentación y hace que sea más fácil proporcionar múltiples implementaciones. Así que podría salirse con la omisión de la definición de interfaz y @implementer
piezas en total.
Donde quiera que desee señalar este evento, utilice el método registry.notify
; aquí supongo que tiene una solicitud disponible para llegar al registro:
request.registry.notify(MyOwnEvent(foo, bar))
Esto enviará la solicitud a todos los suscriptores que haya registrado; ya sea con o config.add_subscriper
con pyramid.events.subscriber
:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
También puede utilizar la interfaz IMyOwnEvent
lugar de la clase MyOwnEvent
y su suscriptor será notificado de todos los eventos que implementan la interfaz, no sólo su aplicación específica de ese evento.
Tenga en cuenta que notificar a los suscriptores nunca detecta excepciones (como send_robust
en Django).