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中获取网页状态码的两个方法
Nov 03 Python
python同时给两个收件人发送邮件的方法
Apr 30 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
python梯度下降法的简单示例
Aug 31 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python 多线程,threading模块,创建子线程的两种方式示例
Sep 29 Python
Python FTP文件定时自动下载实现过程解析
Nov 12 Python
python psutil监控进程实例
Dec 17 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python读取xml文件方法解析
Aug 04 Python
pytorch通过训练结果的复现设置随机种子
Jun 01 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 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语法(2)
2006/10/09 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php提取微信账单的有效信息
2018/10/01 PHP
js分页代码分享
2014/04/28 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
AngularJS中的promise用法分析
2017/05/19 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
Angular实现响应式表单
2017/08/04 Javascript
JS构造一个html文本内容成文件流形式发送到后台
2018/07/31 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
python从sqlite读取并显示数据的方法
2015/05/08 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
python元组拆包实现方法
2021/02/28 Python
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
Dockers鞋官网:Dockers Shoes
2018/11/13 全球购物
斯洛伐克家具和时尚装饰品购物网站:Butlers.sk
2019/09/08 全球购物
售后服务科岗位职责范文
2013/11/13 职场文书
个人简历自荐信
2014/06/26 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
保安辞职信范文
2015/02/28 职场文书
SpringBoot整合MongoDB的实现步骤
2021/06/23 MongoDB
Pytest中skip skipif跳过用例详解
2021/06/30 Python
python数据处理之Pandas类型转换
2022/04/28 Python