2012-06-24 8 views
7

Django tiene un sistema Signals incorporado y sería bastante útil para un proyecto en el que estoy trabajando.Tiene Pyramid un sistema de Señal/Ranura

He estado leyendo los documentos de Pyramid y parece que tiene un sistema Events que está muy ligado a Signals, pero no del todo. ¿Funcionaría algo así para un sistema de señal de propósito general o debería hacerlo yo mismo?

Respuesta

9

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).

Cuestiones relacionadas