2012-06-24 21 views
7

Django xảy ra có hệ thống Signals được tích hợp sẵn và nó sẽ khá hữu ích cho một dự án mà tôi đang làm việc.Kim tự tháp có hệ thống Tín hiệu/Khe cắm

Tôi đã đọc mặc dù tài liệu Kim tự tháp và dường như có hệ thống Events được gắn rất chặt chẽ với Tín hiệu nhưng không hoàn toàn. Có gì giống như công việc này cho một hệ thống tín hiệu mục đích chung hay tôi nên cuộn của riêng tôi?

Trả lời

9

Hệ thống sự kiện được sử dụng bởi Kim tự tháp hoàn thành cùng một trường hợp sử dụng giống như hệ thống Tín hiệu. Ứng dụng của bạn có thể xác định các sự kiện tùy ý và đính kèm người đăng ký với họ.

Để tạo một sự kiện mới, xác định một giao diện cho nó:

from zope.interface import (
    Attribute, 
    Interface, 
    ) 

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

Sau đó, bạn xác định một thực hiện thực tế của sự kiện:

from zope.interface import implementer 

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

Giao diện thực sự là không bắt buộc, nhưng sẽ giúp tài liệu và giúp dễ dàng cung cấp nhiều triển khai hơn. Vì vậy, bạn có thể nhận được ngay với bỏ qua định nghĩa giao diện và @implementer phần hoàn toàn.

Bất cứ nơi nào bạn muốn báo hiệu sự kiện này, hãy sử dụng phương thức registry.notify; ở đây tôi giả sử bạn có một yêu cầu có sẵn để đạt được đăng ký:

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

Điều này sẽ gửi yêu cầu tới bất kỳ người đăng ký nào bạn đã đăng ký; hoặc với config.add_subscriper hoặc với pyramid.events.subscriber:

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

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

Bạn cũng có thể sử dụng giao diện IMyOwnEvent thay vì lớp MyOwnEvent và thuê bao của bạn sẽ được thông báo về tất cả các sự kiện mà thực hiện giao diện, không chỉ thực hiện cụ thể của sự kiện đó.

Lưu ý rằng việc thông báo cho người đăng ký không bao giờ bắt được ngoại lệ (như send_robust ở Django sẽ làm).