Django的信号机制详解

 更新时间:2017年05月05日 08:43:46   作者:卡瓦邦噶!  
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

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语言变量和数据类型基础学习

    这篇文章主要为大家介绍了python语言变量和数据类型基础学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • python中pandas对多列进行分组统计的实现

    python中pandas对多列进行分组统计的实现

    分组统计在很多时候都需要用到,可以实现很多数据库函数的功能。本文主要介绍了python中pandas对多列进行分组统计的实现,感兴趣的可以了解一下
    2021-06-06
  • Python中hash加密简介及使用方法

    Python中hash加密简介及使用方法

    常见 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已经被破解,一般推荐至少使用 SHA2-256 算法,接下来通过本文给大家介绍Python中hash加密简介及使用方法,感兴趣的朋友一起看看吧
    2022-01-01
  • Django中从mysql数据库中获取数据传到echarts方式

    Django中从mysql数据库中获取数据传到echarts方式

    这篇文章主要介绍了Django中从mysql数据库中获取数据传到echarts方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • python使用pyshark库捕获数据包的示例详解

    python使用pyshark库捕获数据包的示例详解

    PyShark是一个基于Python的网络数据包分析工具库,它允许用户捕获、解码和分析实时网络流量,特别是Wi-Fi和TCP/IP协议的数据,所以本文给大家介绍了python使用pyshark库捕获数据包的示例,需要的朋友可以参考下
    2024-08-08
  • 创建pycharm的自定义python模板方法

    创建pycharm的自定义python模板方法

    今天小编就为大家分享一篇创建pycharm的自定义python模板方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • python 命令行参数模块argparse的实现

    python 命令行参数模块argparse的实现

    本文主要介绍了python 命令行参数模块argparse的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python字符串中的单词反转的实现示例

    Python字符串中的单词反转的实现示例

    在Python中,要将字符串中的单词进行反转,本文主要介绍了Python字符串中的单词反转的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • python openpyxl模块的使用详解

    python openpyxl模块的使用详解

    这篇文章主要介绍了python openpyxl模块的使用详解,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • 对Python中TKinter模块中的Label组件实例详解

    对Python中TKinter模块中的Label组件实例详解

    今天小编就为大家分享一篇对Python中TKinter模块中的Label组件实例详解,具有很好的价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06

最新评论