Django的信号机制详解

发布时间 - 2026-01-11 00:58:40    点击率:

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也支持用户 自定义 一些信号。


# django  # 框架详解  # 缓存机制  # django异步机制  # 3分钟看懂Python后端必须知道的Django的信号机制  # 深入理解Django的信号机制  # 可以使用  # 在某个  # 回调  # 而不必  # 是一个  # 就会  # 还可以  # 让我们  # 要在  # 这段  # 要做  # 自定义  # 每次都  # 写在  # 又叫  # 就可以  # 一行字  # 内置了  # request_started  # core 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  javascript读取文本节点方法小结  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel用户密码怎么加密_Laravel Hash门面使用教程  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何快速搭建FTP站点实现文件共享?  如何获取PHP WAP自助建站系统源码?  进行网站优化必须要坚持的四大原则  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  微信小程序 闭包写法详细介绍  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  nodejs redis 发布订阅机制封装实现方法及实例代码  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何在建站宝盒中设置产品搜索功能?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何在Windows服务器上快速搭建网站?  如何在企业微信快速生成手机电脑官网?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  非常酷的网站设计制作软件,酷培ai教育官方网站?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Python面向对象测试方法_mock解析【教程】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Java遍历集合的三种方式  WEB开发之注册页面验证码倒计时代码的实现  网页设计与网站制作内容,怎样注册网站?  Laravel如何使用.env文件管理环境变量?(最佳实践)  JavaScript模板引擎Template.js使用详解  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  iOS发送验证码倒计时应用  如何挑选优质建站一级代理提升网站排名?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何在宝塔面板创建新站点?  LinuxCD持续部署教程_自动发布与回滚机制  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  5种Android数据存储方式汇总  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制