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继承和抽象类的实现方法
Jan 14 Python
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
python匿名函数用法实例分析
Aug 03 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
Jan 18 Python
解决python 找不到module的问题
Feb 12 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
python tkinter 设置窗口大小不可缩放实例
Mar 04 Python
Python wordcloud库安装方法总结
Dec 31 Python
python3判断IP地址的方法
Mar 04 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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 7中不要做的10件事
2016/09/18 PHP
多广告投放代码 推荐
2006/11/13 Javascript
共享自己写一个框架DreamScript
2007/01/20 Javascript
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
JavaScript中window、doucment、body的解释
2013/08/14 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
Vue实现购物车功能
2017/04/27 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
python实现复制整个目录的方法
2015/05/12 Python
对命令行模式与python交互模式介绍
2018/05/12 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python list转矩阵的实例讲解
2018/08/04 Python
python+opencv实现阈值分割
2018/12/26 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python中web框架的自定义创建
2019/09/08 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
Shell如何接收变量输入
2012/09/24 面试题
模具专业求职信
2014/06/26 职场文书
岳麓书院导游词
2015/02/03 职场文书
预备党员介绍人意见
2015/06/01 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server