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门面及其工作机制

