Django的信号机制—Signals

我们经常会在影视作品中听到一句话: 看我的眼神行事。 我们: 嗯嗯?? 眼神。这个眼睛小了可能看不到。 那这个信号就很难说收不收的到了,还好代码不会模糊。

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

內建信号

Django本身已经在很多的处理上內建了信号,比如在保存一个对象时:发出一个pre_save信号之后再进行具体的保存操作,保存对象完成之后也会发出一个post_save信号才算整个流程的结束。以下是常用的
一些內建信号:
以上只是一些常见的信号,具体还有多少,大家感兴趣的话可以去內建信号的文档里面看看。接下来,先试一哈,內建的信号好不好用。

內建信号的使用

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

自定义信号

如果內建的信号定义信号发送信号也可以使用两种方式来发送:为 [(receiver, response), … ] ,代表了被调用的接收器函数和他们的响应值。两种发送信号的方式主要体现在于:

在receiver函数产生的异常时有所不同,不是所有的receiver都会获取通知。

send()

不会捕获任何由receiver产生的异常,它会简单地让错误往上传递。所以在错误产生的情况,不是所有receiver 都会获得通知。

send_robust()

捕获所有继承自Python Exception类的异常,并且确保所有receiver都能得到信号的通知。如果发生错误,错误实例会在产生错误的receiver 的二元组中返回。

在哪里注册信号

信号可以在Models中进行注册,也可以在 ready() 中引入。具体写在哪里,大家各自喜爱就好。
以上是关于Django的Signal的一些简单的使用以及一些基本信息的介绍。

Spread the word. Share this post!

Meet The Author

Leave Comment