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框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
Python堆排序原理与实现方法详解
May 11 Python
Python应用库大全总结
May 30 Python
python实现控制台打印的方法
Jan 12 Python
详解Python字符串切片
May 20 Python
python交易记录链的实现过程详解
Jul 03 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
python -v 报错问题的解决方法
Sep 15 Python
python 动态渲染 mysql 配置文件的示例
Nov 20 Python
python tkinter模块的简单使用
Apr 07 Python
用Python实现屏幕截图详解
Jan 22 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
探讨多键值cookie(php中cookie存取数组)的详解
2013/06/06 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
JavaScript对象引用与赋值实例详解
2017/03/15 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
python进阶教程之模块(module)介绍
2014/08/30 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
目前最全的python的就业方向
2018/06/05 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
详解python中*号的用法
2019/10/21 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
英国足球店:UK Soccer Shop
2017/11/19 全球购物
服装电子商务创业计划书
2014/01/30 职场文书
怎样填写就业意向
2014/04/02 职场文书
临床医师个人自我评价
2014/04/06 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
刑事撤诉申请书
2015/05/18 职场文书
歌剧魅影观后感
2015/06/05 职场文书
廉洁自律证明
2015/06/24 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
Python中Numpy和Matplotlib的基本使用指南
2021/11/02 Python