django信号系统 - 事件驱动编程模式
📂 所属阶段:第二部分 — 进阶特性
🎯 难度等级:中级
⏰ 预计学习时间:2小时
🎒 前置知识:模型设计与ORM操作
核心概念:什么是django信号?
django信号是观察者模式的标准实现,用于松耦合的应用组件通信:当某个「事件」发生时(如模型保存/删除、请求开始/结束),触发信号,自动通知所有「订阅」该信号的接收者。
信号的三个核心角色
快速上手:最基础的信号使用
1. 引入依赖
2. 接收者注册(两种方式)
方式一:装饰器语法(推荐)
方式二:手动连接
3. 信号触发(无需写额外代码)
当执行 User.objects.create_user(...) 或 user.save() 时,post_save 信号会自动触发。
常用内置信号
django内置了三类常用信号,覆盖核心场景。
1. 模型信号(最常用)
操作数据库模型时自动触发:
模型信号示例:自动更新文章字数
2. 请求信号
处理HTTP请求时触发:
3. 应用/项目信号
应用信号示例:迁移后创建超级管理员
自定义信号:满足个性化需求
当内置信号不够用时,可以创建自定义信号。
1. 定义自定义信号
2. 发送自定义信号
3. 接收自定义信号
最佳实践与避坑指南
⚠️ 避坑1:信号必须在应用启动时被导入
如果信号模块没被导入,接收者不会生效!必须在 apps.py 的 ready() 中显式导入:
⚠️ 避坑2:默认是同步阻塞的
信号接收者如果执行耗时操作(如发邮件、调用API),会直接阻塞主线程!必须用异步任务(如Celery):
⚠️ 避坑3:避免信号循环调用
如果在 post_save 接收者中再次调用 instance.save(),会触发无限循环!解决方法有两个:
- 添加处理标志
- 使用
update_fields或QuerySet.update()
⚠️ 避坑4:大量数据操作时临时断开信号
bulk_create 不会触发单个信号,但如果必须逐行操作,记得临时断开信号以提升性能:
本章小结
django信号是解耦应用组件的利器,但必须谨慎使用:
- ✅ 适合场景:数据同步、缓存失效、审计日志、通知推送
- ❌ 不适合场景:核心业务逻辑(信号是「可选的通知」,不是「必须的依赖」)
- 🚀 优化建议:用异步任务、避免循环、大量操作时断开信号
🔗 相关教程推荐
- 模型设计与ORM操作 - 模型基础
- 缓存策略 - 性能优化
- 异步任务处理 - 异步处理
🏷️ 标签云: django信号 事件驱动 观察者模式 解耦 Celery 性能优化

