पिरामिड द्वारा उपयोग की जाने वाली घटना प्रणाली सिग्नल सिस्टम के समान सटीक उपयोग-मामलों को पूरा करती है। आपका आवेदन मनमाने ढंग से घटनाओं को परिभाषित कर सकता है और ग्राहकों को उनके साथ जोड़ सकता है।
नया ईवेंट बनाने, इसके लिए एक इंटरफेस को परिभाषित करने के लिए:
from zope.interface import (
Attribute,
Interface,
)
class IMyOwnEvent(Interface):
foo = Attribute('The foo value')
bar = Attribute('The bar value')
फिर आप घटना के वास्तविक क्रियान्वयन निर्धारित करें:
from zope.interface import implementer
@implementer(IMyOwnEvent)
class MyOwnEvent(object):
def __init__(self, foo, bar):
self.foo = foo
self.bar = bar
इंटरफ़ेस वास्तव में वैकल्पिक है, लेकिन मदद करता है दस्तावेज़ीकरण और कई कार्यान्वयन प्रदान करना आसान बनाता है। तो आप इंटरफेस परिभाषा और @implementer
भागों को पूरी तरह से छोड़कर दूर हो सकते हैं।
जहां भी आप इस घटना को सिग्नल करना चाहते हैं, registry.notify
विधि का उपयोग करें; यहां मुझे लगता है कि आपके पास रजिस्ट्री तक पहुंचने के लिए एक अनुरोध उपलब्ध है:
request.registry.notify(MyOwnEvent(foo, bar))
यह आपके द्वारा पंजीकृत किसी भी ग्राहक को अनुरोध भेज देगा; किसी के साथ config.add_subscriper
या pyramid.events.subscriber
साथ:
from pyramid.events import subscriber
from mymodule.events import MyOwnEvent
@subscriber(MyOwnEvent)
def owneventsubscriber(event):
event.foo.spam = 'eggs'
तुम भी IMyOwnEvent
इंटरफ़ेस बजाय MyOwnEvent
वर्ग के उपयोग कर सकते हैं और अपने ग्राहक सभी घटनाओं है कि इंटरफ़ेस, न सिर्फ अपने उस घटना के विशिष्ट कार्यान्वयन लागू की सूचना दी जाएगी।
ध्यान दें कि ग्राहकों को सूचित करना कभी अपवाद नहीं लेता है (जैसे Django में send_robust
)।
स्रोत
2012-06-24 09:27:26