2012-06-24 14 views
7

Django, yerleşik bir Signals sistemine sahip olur ve üzerinde çalıştığım bir proje için oldukça yararlı olur.Piramidin bir Sinyal/Slot sistemi var

Pyramid belgelerini okudum ve Signals ile çok yakından bağlantılı olan bir Events sistemine sahip gibi görünüyor. Böyle bir şey genel amaçlı bir sinyal sistemi için çalışır mıyım yoksa kendi başıma mı dönmeliyim?

cevap

9

Pyramid tarafından kullanılan olay sistemi, Sinyaller sistemi ile aynı kullanım durumlarını karşılar. Uygulamanız keyfi etkinlikleri tanımlayabilir ve bunlara abone ekleyebilirsiniz.

from zope.interface import (
    Attribute, 
    Interface, 
    ) 

class IMyOwnEvent(Interface): 
    foo = Attribute('The foo value') 
    bar = Attribute('The bar value') 

Daha sonra olayın gerçek uygulanmasını tanımlamak:

bunun için bir arabirim tanımlamak, yeni bir etkinlik oluşturmak için arayüz aslında isteğe bağlıdır

from zope.interface import implementer 

@implementer(IMyOwnEvent) 
class MyOwnEvent(object): 
    def __init__(self, foo, bar): 
     self.foo = foo 
     self.bar = bar 

ama yardımcı olur dokümantasyon ve birden fazla uygulama sunmayı kolaylaştırır. Böylece arayüz tanımı ve @implementer parçalarının tamamen kaldırılmasıyla birlikte uzaklaşabilirsiniz.

Bu olayı işaret etmek istediğiniz her yerde, registry.notify yöntemini kullanın; Burada sana kayıt ulaşmak için mevcut bir isteği var varsayalım: Bu, kaydettiğiniz herhangi abonelere istek gönderirsiniz

request.registry.notify(MyOwnEvent(foo, bar)) 

; Ya config.add_subscriper veya pyramid.events.subscriber ile birlikte:

from pyramid.events import subscriber 
from mymodule.events import MyOwnEvent 

@subscriber(MyOwnEvent) 
def owneventsubscriber(event): 
    event.foo.spam = 'eggs' 

Ayrıca MyOwnEvent sınıfın yerine IMyOwnEvent arayüzü kullanabilirsiniz ve abone arayüzü, söz konusu etkinliğin sadece belirli uygulanmasını uygulamak tüm olayların bildirilecektir.

Abonelerin bildirilmesinin, özel durumları asla yakalamadığını unutmayın (Django'da send_robust gibi).

İlgili konular