
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"]) 怎么样才能触发这两个信号?
1 takanasi OP 四个小时前是鬼 |
2 TanLian 2017 年 10 月 14 日 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 某函数 |
4 EchoUtopia 2017 年 10 月 14 日 原理的话很简单,signal 里面有个 receivers 属性,是个 list, 有函数被 receiver 装饰了,就把这个函数 append 到 signal 的 receivers 属性里。然后调用这个 signal.send 函数的时候,就依次调用 receivers 里面的函数 |
5 workwonder 2017 年 10 月 14 日 via Android 我用的 arango-orm 库由于没有事件机制,我就自己写了,你可以看下相当简单的,还有单元测试。 https://github.com/wonderbeyond/arango-orm/commit/1559cba970ea28fe96536efb739f8d558ef7370d |
6 wcsjtu 2017 年 10 月 14 日 其实就是定义了一个 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 ``` |