Django Signals小结
目录
Signals 用处
django有一个“信号分配器”(signal dispatcher)使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒。简单说,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是很有用的设计,因为可能多处代码对某些事件是很感兴趣,比如删除动作。
为此,django提供了很多内置的信号,当django触发某些动作时而通知到用户代码,包括:
django.db.models.signals.pre_save & django.db.models.signals.post_save
modle’ssave()
被调用之前或之后,发送signaldjango.db.models.signals.pre_delete & django.db.models.signals.post_delete
model’sdelete()
或者query_set’sdelete()
被调用之前或之后,发送signaldjango.db.models.signals.m2m_changed
当modle的ManyToManyField
有修改时触发django.core.signals.request_started & django.core.signals.request_finished
当Django开始或者完成一个http请求
同样Django支持自定义Signal 如:
|
|
监听 signals
要想接受信号,首先要用Signal.connect()
注册一个接收器函数。发送signal,则接收函数被调用
Signal.connect(receiver[,sender=None,weak=True,dispatch_uid=None])
参数解释:
- receiver:连接到这个信号的回调函数
- sender:信号的发送者
- weak:是否是弱引用,默认是真。因此,如果你的接收器是是一个本地函数,会被当做垃圾回收,如果你不想,请在使用connect()方法的时候使用weak=False(1.9中以后被废弃)
- dispatch_uid:一个唯一的标识符给信号接收器,避免重复的信号被发送
定义接收函数
|
|
注意的是所有的信号处理器都需要这两个参数:sender和 **kwargs。因为所有的信号都是发送关键字参数的,可能处理的时候没有任何参数,但不意味着在处理的过程中(在你写的处理函数之前)有任何的参数生成,如果没有传 kwargs参数的话,可能会发生问题;基于这样的考虑,这两个参数都是必须的。
连接接收函数
有两中方法可以使用
- 手动connect
|
|
- 用装饰器receiver
|
|
使用完整示例
|
|
注意:
update()
并不会触发pre_save, post_save
信号
所以当有这样的操作:
GroupSettings.objects.filter(business_group=business_group).update(**filterd)
想触发信号发送时,可以这样修改:
|
|