Django的信号———Signals

Django的信号———Signals


我们经常会在影视作品中听到一句话: 看我的眼神行事。 我们: 嗯嗯?? 眼神。这个眼睛小了可能看不到。 那这个信号就很难说收不收的到了,还好代码不会模糊。 
在Django中当我们需要在某些Model改变时候,做一些用户权限修改,或者通过引擎下发一些内容,可以使用Django本身的信号机制。 
Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。简单来说,信号允许特定的sender通知一组receiver某些操作已经发生。这在多处代码和同一事件有关联的情况下很有用。 
“有用???” ,那到底好不好用啊 
先让我们看看Django本身都有哪些信号:

內建信号

Django本身已经在很多的处理上內建了信号,比如在保存一个对象时:发出一个pre_save信号之后再进行具体的保存操作,保存对象完成之后也会发出一个post_save信号才算整个流程的结束。以下是常用的一些內建信号:

django .db .models .signals .pre_save&django .db .models .signals .post_save

在模型 save()方法调用之前或之后发送。

django .db .models .signals .pre_delete&django .db .models .signals .post_delete

在模型delete()方法或查询集的delete() 方法调用之前或之后发送。

django .db .models .signals .m2m_changed

模型上的 ManyToManyField 修改时发送。

django .core .signals .request_started&django .core .signals .request_finished

Django建立或关闭HTTP请求时发送。 
以上只是一些常见的信号,具体还有多少,大家感兴趣的话可以去內建信号的文档里面看看。 
接下来,先试一哈內建的信号好不好用

內建信号的使用

监听信号可以使用以下两种方式来监听 
方法一:

@receiver(pre_save, sender=Customers)
def my_handler(sender, **kwargs):
'''
这里监听到信号就可以做爱做的事情
'''
print 'my_cutomer_pre_save_handle'

方法二:

def my_handler(sender, **kwargs):
'''
这里监听到信号就可以做爱做的事情
'''
print 'my_cutomer_pre_save_handle'
pre_save.connect(my_handler)

在Customer模型调用save()之前会调用 
其中connect可以使用dispatch_uid 参数来避免重复信号: 
通常是一个字符串,一个信号receiver的唯一标识符,以防信号多次发送 
接下来,万一內建的不喜欢,要用自己的呢? 那自己的好不好定义?好不好用呢?

自定义信号

如果內建的信号 
定义信号

import django .dispatch
signalTest = django .dispatch .Signal(providing_args=[ 'test'])

发送信号也可以使用两种方式来发送: 
方式1:

from customers.signals import signalTest
signalTest.send(sender=Customers, test= 'test_signals')

方式2:

from customers.signals import signalTest
signalTest.send_robust(sender=Customers, test= 'test_signals')

两种方法都返回如下信息:

[( <function my_handler at 0x7f440dd65398>, None)]

[(receiver, response), ... ],代表了被调用的接收器函数和他们的响应值。两种发送信号的方式主要体现在于: 
在receiver函数产生的异常时有所不同,不是所有的receiver都会获取通知。 
send() 
不会捕获任何由receiver产生的异常,它会简单地让错误往上传递。所以在错误产生的情况,不是所有receiver 都会获得通知。 
send_robust() 
捕获所有继承自Python Exception类的异常,并且确保所有receiver都能得到信号的通知。如果发生错误,错误实例会在产生错误的receiver 的二元组中返回。

监听信号 
监听自定义信号的方法和内置信号的方法相同

@receiver(signalTest, sender=Customers)
def my_handler(sender, **kwargs):
print 'my_cutomer_pre_save_handle'

断开信号

from django .db .models import signals
signals .pre_save .disconnect(my_handler)

如果接收器成功断开,返回 True ,否则返回False

在哪里注册信号

信号可以在Models中进行注册,也可以在ready()中引入。

class CustomerConfig(AppConfig):
name = 'customers'
def ready(self):
import signal

具体写在哪里,大家各自喜爱就好。

END

最后这个东西有用肯定是有用,看的出来也非常的好用,简单清楚。 
以上是关于Django的Signal的一些简单的使用以及一些基本信息的介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值