2012-06-24 16 views
7

Django ha un sistema Signals integrato e sarebbe molto utile per un progetto su cui sto lavorando.Pyramid dispone di un sistema Signal/Slot

Ho letto i documenti Pyramid e sembra che abbia un sistema Events che è strettamente collegato ai segnali, ma non del tutto. Qualcosa del genere funzionerebbe per un sistema di segnali generico o dovrei far girare il mio?

risposta

9

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

Problemi correlati