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 相关文章推荐
python构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
python计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python递归遍历列表及输出的实现方法
May 19 Python
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
windows下python安装小白入门教程
Sep 18 Python
Python 实现使用空值进行赋值 None
Mar 12 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
opencv-python图像配准(匹配和叠加)的实现
Jun 23 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
业余方法DIY电子管FM收音机
2021/03/02 无线电
php与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
2014/11/04 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
使用Angular9和TypeScript开发RPG游戏的方法
2020/03/25 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
python将字符串转换成数组的方法
2015/04/29 Python
Python实现的简单dns查询功能示例
2017/05/24 Python
对Python中type打开文件的方式介绍
2018/04/28 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
python将音频进行变速的操作方法
2020/04/08 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
编写strcpy函数
2014/06/24 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
会计毕业生自我鉴定
2013/11/04 职场文书
班级读书活动总结
2014/06/30 职场文书
论文致谢词范文
2015/05/14 职场文书
学术研讨会主持词
2015/07/04 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
教学反思怎么写
2016/02/24 职场文书