Django的信号机制详解


Posted in Python onMay 05, 2017

Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。

Django内置了一些信号,比如:

django.db.models.signals.pre_save 在某个Model保存之前调用
django.db.models.signals.post_save 在某个Model保存之后调用
django.db.models.signals.pre_delete 在某个Model删除之前调用
django.db.models.signals.post_delete 在某个Model删除之后调用
django.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送

我们要做的,就是注册一个receiver函数。例如,如果要在每次请求完成之后,打印一行字。

可以使用回调的方式注册:

# receiver
def my_callback(sender, **kwargs):
  print("Request finished!")
 
# connect
from django.core.signalsimport request_finished
 
request_finished.connect(my_callback)

也可以使用装饰器的方式注册,下面这段代码和上面完全是等价的。

from django.core.signalsimport request_finished
from django.dispatchimport receiver
 
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

receiver回调函数除了可以使用sender之外,还可以使用其他一些参数,比如针对pre_save函数:

sender:发送者(如果是pre_save的话,就是model class)
instance:实例
raw
using
update_fields
post_save()是一个比较实用函数,可以支持一些联动的更新。而不必让我们每次都写在view里面。比如:有用户提交了退款申请,我们需要把订单的状态修改成“已退款”的状态。就可以使用信号机制,而不必在每处都修改。

@receiver(post_save, sender=RefundForm)
deforder_state_update(sender, instance, created, **kwargs):
  instance.order.state = REFUNDING
  instance.order.save() # 这里,order是refundform的一个外键

当然,这里可以写的更多更周全,例如退款单取消改回状态等。

观察者是非常实用的一个设计模式,Django也支持用户 自定义 一些信号。

Python 相关文章推荐
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
Python中逗号的三种作用实例分析
Jun 08 Python
Pycharm远程调试openstack的方法
Nov 21 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
Python3 max()函数基础用法
Feb 19 Python
详解Django中CBV(Class Base Views)模型源码分析
Feb 25 Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
Python中模块与包有相同名字的处理方法
May 05 #Python
详解python 字符串和日期之间转换 StringAndDate
May 04 #Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 #Python
python 统计代码行数简单实例
May 04 #Python
利用PyInstaller将python程序.py转为.exe的方法详解
May 03 #Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 #Python
利用numpy+matplotlib绘图的基本操作教程
May 03 #Python
You might like
PHP伪造referer实例代码
2008/09/20 PHP
php中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
PHP7 新增常量
2021/03/09 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
jQuery使用fadein方法实现渐出效果实例
2015/03/27 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
JavaScript实现通过select标签跳转网页的方法
2016/09/29 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
ES6的异步终极解决方案分享
2019/07/11 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
Python如何读写字节数据
2020/08/05 Python
python 用struct模块解决黏包问题
2020/11/07 Python
Python编写万花尺图案实例
2021/01/03 Python
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
电气专业应届生求职信
2013/11/01 职场文书
北体毕业生求职信
2014/02/28 职场文书
中职生自荐信范文
2014/06/15 职场文书
学习雷锋标语
2014/06/25 职场文书
2014国庆节标语口号
2014/09/19 职场文书
个人四风问题整改措施思想汇报
2014/10/04 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
干部理论学习心得体会
2016/01/21 职场文书
python析构函数用法及注意事项
2021/06/22 Python