django_socketio的events机制如何运行的?
https://pypi.python.org/pypi/django-socketio/0.1.5 events.py起什么作用,查看代码找不到调用它的地方
tylunas
11 years, 4 months ago
Answers
在使用 events 时,我们可以用它提供的装饰器 @on_connect, @on_message 等, 装饰器的作用在于包裹(过滤)你对目标函数的调用, 在 events.py 第 67 行开始, 定义了 on_message 等均指向一个 Event 对象, Event 对象中有实现 __call__ 函数, 这标志着其对象可以被当作函数执行, 在 __call__ 中定义了装饰器回调函数 handler_with_channel。
整体运行过程为:
-
你定义了函数并绑定了装饰器如 @on_message, 这时会将目标函数追加到 on_message(Event对象) 的 handlers 中, 作为事件回调函数等待调用
-
在 views.py 中(我没细看其他的文件, 也许还有), 可以看到 import events 并在各个动作发生时调用了不同的 Event 对象(on_message 等就是实例,前面说了因为他有 __call__ 所以可以当作函数调用, 返回函数的函数可以作为装饰器) 的 send 函数触发事件
-
在 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")
解释一下几个要点:
- ooo 是 lin 的实例,我且理解为 lin 是一个发送消息的类,lin 有一个 send 方法,参数为消息主体;
- h1 h2 是你要注册到发送消息时的事件处理句柄,他们在发送消息前(或后,取决于在send里的调用位置)干点事情;
- ooo.send(msg) 开始把消息发出去,send执行中会执行已经注册进去的事件处理句柄,我们管这个过程叫触发事件。
- 如果你把触发事件的过程独立出来,可以实现更复杂的功能,比如阻断默认行为。
一具冰冷的鸭梨
answered 11 years, 4 months ago