django 的信号是什么原理?

2017-10-14 16:46:01 +08:00
 takanasi
from django.dispatch import Signal

user_logged_in = Signal(providing_args=["request", "user"])

# Typically followed by `user_logged_in` (unless, e-mail verification kicks in)
user_signed_up = Signal(providing_args=["request", "user"])

怎么样才能触发这两个信号?

3493 次点击
所在节点    Python
6 条回复
takanasi
2017-10-14 16:49:23 +08:00
四个小时前是鬼
TanLian
2017-10-14 16:51:36 +08:00
user_logged_in.send(sender=xx,request=xx,user=xx)
user_signed_up.send(sender=xx,request=xx,user=xx)
上面这两句就是触发这两个信号了,不过你还要先定义接收函数,如

@receiver(user_logged_in)
def 某函数
takanasi
2017-10-14 17:15:14 +08:00
@TanLian 大概理解了
sender 我写 self 没事吧?
EchoUtopia
2017-10-14 17:20:29 +08:00
原理的话很简单,signal 里面有个 receivers 属性,是个 list, 有函数被 receiver 装饰了,就把这个函数 append 到 signal 的 receivers 属性里。然后调用这个 signal.send 函数的时候,就依次调用 receivers 里面的函数
workwonder
2017-10-14 18:12:45 +08:00
我用的 arango-orm 库由于没有事件机制,我就自己写了,你可以看下相当简单的,还有单元测试。
https://github.com/wonderbeyond/arango-orm/commit/1559cba970ea28fe96536efb739f8d558ef7370d
wcsjtu
2017-10-14 20:43:32 +08:00
其实就是定义了一个 signal: handler 的映射, 你发送信号时, 会去搜索对应的回调函数然后调用
看看 django/dispatch/dispatcher.py 文件中的 Signal.send 函数, `receiver`就是信号接收函数,也就是 receiver 修饰器修饰的函数。 感觉这段代码,平平无奇啊~ 没有黑科技的感觉

```python
def send(self, sender, **named):
responses = []
if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:
return responses

for receiver in self._live_receivers(sender):
response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response))
return responses

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/397602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX