Django的信号———Signals
我们经常会在影视作品中听到一句话: 看我的眼神行事。 我们: 嗯嗯?? 眼神。这个眼睛小了可能看不到。 那这个信号就很难说收不收的到了,还好代码不会模糊。
在Django中当我们需要在某些Model改变时候,做一些用户权限修改,或者通过引擎下发一些内容,可以使用Django本身的信号机制。
Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到。简单来说,信号允许特定的sender通知一组receiver某些操作已经发生。这在多处代码和同一事件有关联的情况下很有用。
“有用???” ,那到底好不好用啊
先让我们看看Django本身都有哪些信号:
內建信号
Django本身已经在很多的处理上內建了信号,比如在保存一个对象时:发出一个pre_save
信号之后再进行具体的保存操作,保存对象完成之后也会发出一个post_save
信号才算整个流程的结束。以下是常用的一些內建信号:
在模型 save()
方法调用之前或之后发送。
在模型delete()
方法或查询集的delete()
方法调用之前或之后发送。
模型上的 ManyToManyField
修改时发送。
Django建立或关闭HTTP请求时发送。
以上只是一些常见的信号,具体还有多少,大家感兴趣的话可以去內建信号的文档里面看看。
接下来,先试一哈內建的信号好不好用
內建信号的使用
监听信号可以使用以下两种方式来监听
方法一:
方法二:
在Customer模型调用save()
之前会调用
其中connect可以使用dispatch_uid
参数来避免重复信号:
通常是一个字符串,一个信号receiver的唯一标识符,以防信号多次发送
接下来,万一內建的不喜欢,要用自己的呢? 那自己的好不好定义?好不好用
呢?
自定义信号
如果內建的信号
定义信号
发送信号也可以使用两种方式来发送:
方式1:
方式2:
两种方法都返回如下信息:
为[(receiver, response), ... ]
,代表了被调用的接收器函数和他们的响应值。两种发送信号的方式主要体现在于:
在receiver函数产生的异常时有所不同,不是所有的receiver都会获取通知。 send()
不会捕获任何由receiver产生的异常,它会简单地让错误往上传递。所以在错误产生的情况,不是所有receiver 都会获得通知。 send_robust()
捕获所有继承自Python Exception类的异常,并且确保所有receiver都能得到信号的通知。如果发生错误,错误实例会在产生错误的receiver 的二元组中返回。
监听信号
监听自定义信号的方法和内置信号的方法相同
断开信号
如果接收器成功断开,返回 True
,否则返回False
。
在哪里注册信号
信号可以在Models中进行注册,也可以在ready()
中引入。
具体写在哪里,大家各自喜爱就好。
END
最后这个东西有用肯定是有用,看的出来也非常的好用,简单清楚
。
以上是关于Django的Signal的一些简单的使用以及一些基本信息的介绍。