首页 > django_socketio的events机制如何运行的?

django_socketio的events机制如何运行的?

https://pypi.python.org/pypi/django-socketio/0.1.5 events.py起什么作用,查看代码找不到调用它的地方


在使用 events 时,我们可以用它提供的装饰器 @on_connect, @on_message 等, 装饰器的作用在于包裹(过滤)你对目标函数的调用, 在 events.py 第 67 行开始, 定义了 on_message 等均指向一个 Event 对象, Event 对象中有实现 __call__ 函数, 这标志着其对象可以被当作函数执行, 在 __call__ 中定义了装饰器回调函数 handler_with_channel。

整体运行过程为:

  1. 你定义了函数并绑定了装饰器如 @on_message, 这时会将目标函数追加到 on_message(Event对象) 的 handlers 中, 作为事件回调函数等待调用

  2. 在 views.py 中(我没细看其他的文件, 也许还有), 可以看到 import events 并在各个动作发生时调用了不同的 Event 对象(on_message 等就是实例,前面说了因为他有 __call__ 所以可以当作函数调用, 返回函数的函数可以作为装饰器) 的 send 函数触发事件

  3. 在 Event 实例的 send 中, 会遍历 handlers 执行你已经注册进去的事件回调函数


2013/11/13

把你给的代码改了下:


class lin(object):
    m=[]
    def __call__(self, hand):
        def hand_w(a):
            return hand(self, a)
        self.m.append(hand)
        return hand_w

    def send(self, a):
        print "send start"
        for hand in self.m:
            hand(self, a)
        print "send end"

ooo=lin()

@ooo
def h1(evt, a):
    print "in event handle 1, the arg is %s" % a

@ooo
def h2(evt, a):
    print "in event handle 2, the arg is %s" % a

ooo.send("test")

解释一下几个要点:

  1. ooo 是 lin 的实例,我且理解为 lin 是一个发送消息的类,lin 有一个 send 方法,参数为消息主体;
  2. h1 h2 是你要注册到发送消息时的事件处理句柄,他们在发送消息前(或后,取决于在send里的调用位置)干点事情;
  3. ooo.send(msg) 开始把消息发出去,send执行中会执行已经注册进去的事件处理句柄,我们管这个过程叫触发事件。
  4. 如果你把触发事件的过程独立出来,可以实现更复杂的功能,比如阻断默认行为。
【热门文章】
【热门文章】