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中计算三角函数之cos()方法的使用简介
May 15 Python
使用numba对Python运算加速的方法
Oct 15 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
python实现公司年会抽奖程序
Jan 22 Python
ML神器:sklearn的快速使用及入门
Jul 11 Python
解决python tkinter界面卡死的问题
Jul 17 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
利用pandas向一个csv文件追加写入数据的实现示例
Apr 23 Python
python实现图片转字符画
Feb 19 Python
python实现简单的名片管理系统
Apr 26 Python
python用tkinter开发的扫雷游戏
Jun 01 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中文本操作的类
2007/03/17 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
jQuery多选框选择数量限制方法
2017/02/08 Javascript
vue中slot(插槽)的介绍与使用
2018/11/12 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
[02:22]完美世界DOTA2联赛PWL S3 集锦第一期
2020/12/15 DOTA
理解Python中函数的参数
2015/04/27 Python
浅析Python中return和finally共同挖的坑
2017/08/18 Python
python机器学习之神经网络(一)
2017/12/20 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
django自带调试服务器的使用详解
2019/08/29 Python
通过python3实现投票功能代码实例
2019/09/26 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
python 基于wx实现音乐播放
2020/11/24 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
美术学专业求职信
2014/07/23 职场文书
环境科学专业求职信
2014/08/04 职场文书
2014年单位工作总结范文
2014/11/27 职场文书
丽江古城导游词
2015/02/03 职场文书
公司管理建议书
2015/09/14 职场文书
销售口号霸气押韵
2015/12/24 职场文书