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 相关文章推荐
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Python读取Excel的方法实例分析
Jul 11 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
Jun 23 Python
对Python中type打开文件的方式介绍
Apr 28 Python
python爬虫URL重试机制的实现方法(python2.7以及python3.5)
Dec 18 Python
Python3中函数参数传递方式实例详解
May 05 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
2021年值得向Python开发者推荐的VS Code扩展插件
Jan 25 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中创建和验证哈希的简单方法实探
2015/07/06 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
js中switch case循环实例代码
2013/12/30 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
JavaScript页面模板库handlebars的简单用法
2015/03/02 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
jQuery实现的手风琴侧边菜单效果
2017/03/29 jQuery
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
2020/07/29 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
Python连接数据库学习之DB-API详解
2017/02/07 Python
Pycharm编辑器技巧之自动导入模块详解
2017/07/18 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
numpy.where() 用法详解
2019/05/27 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
de Bijenkorf比利时官网:荷兰最知名的百货商店
2017/06/29 全球购物
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
异常和异常类的概念
2014/09/12 面试题
护理毕业生自荐信范文
2013/12/22 职场文书
物业总经理岗位职责
2014/02/28 职场文书
家长会学生演讲稿
2014/04/26 职场文书
工商行政管理专业求职书
2014/05/23 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript