Django 信号机制:内置信号与自定义信号实现解耦

Mason
Mason
发布时间:2026-10-12| 4人浏览过
原创

Django 框架通过信号(Signals)机制实现了组件间的解耦。它允许特定的发送者在特定操作发生时,通知特定的接收者执行相应逻辑。理解信号机制对于掌握 Django 内部运作及编写灵活的业务逻辑至关重要。

内置信号:框架操作的自动触发

Django 内置了一系列信号,它们与框架的核心操作紧密集成。当程序执行特定操作(如模型保存、删除、迁移或请求处理)时,这些信号会自动触发已注册的函数。开发者无需手动处理触发逻辑,只需注册对应的接收器即可。

主要内置信号分类

内置信号主要分为以下几类,覆盖了模型生命周期、迁移过程、请求处理及测试环境:

  • Model signals(模型信号):覆盖模型的构造、保存、删除及多对多字段操作前后。
  • Management signals(管理信号):覆盖 migrate 命令执行前后。
  • Request/response signals(请求/响应信号):覆盖请求开始、结束及异常处理。
  • Test signals(测试信号):覆盖测试时配置文件修改及模板渲染。
  • Database Wrappers(数据库包装器):覆盖数据库连接创建。

具体信号列表如下:

Model signals
  pre_init          # django的modal执行其构造方法前,自动触发
  post_init          # django的modal执行其构造方法后,自动触发
  pre_save          # django的modal对象保存前,自动触发
  post_save          # django的modal对象保存后,自动触发
  pre_delete         # django的modal对象删除前,自动触发
  post_delete         # django的modal对象删除后,自动触发
  m2m_changed         # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
  class_prepared       # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
  pre_migrate         # 执行migrate命令前,自动触发
  post_migrate        # 执行migrate命令后,自动触发
Request/response signals
  request_started       # 请求到来前,自动触发
  request_finished      # 请求结束后,自动触发
  got_request_exception    # 请求异常后,自动触发
Test signals
  setting_changed       # 使用test测试修改配置文件时,自动触发
  template_rendered      # 使用test测试渲染模板时,自动触发
Database Wrappers
  connection_created     # 创建数据库连接时,自动触发

注册内置信号

要使用内置信号,需从 django.db.models 导入 signals 模块,并使用 connect 方法将信号与接收函数绑定。例如,在模型保存前后执行特定逻辑:

#在model表中添加/删除记录时执行响应的方法
from django.db.models import signals

def before_save1(*args,**kwargs):
  print('有车来了,我要服务了--》',args,kwargs)

def before_save2(*args,**kwargs):
  print('有车来了,我要服务了--》',args,kwargs)

def after_save1(*args,**kwargs):
  print('有车来了,完事了--》',args,kwargs)

signals.pre_save.connect(before_save1)
signals.pre_save.connect(before_save2)
signals.post_save.connect(after_save1)

自定义信号:实现灵活的业务解耦

虽然内置信号覆盖了大部分场景,但在某些特定业务逻辑中,可能需要自定义信号。自定义信号需要开发者在代码的任意位置手动触发,这提供了极大的灵活性。

定义与注册

首先,通过 django.dispatch.Signal 类定义信号,并可指定 providing_args 来声明信号传递的参数:

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

接着,定义接收函数并通过 connect 方法注册到该信号:

def callback(sender, **kwargs):
  print("callback")
  print(sender,kwargs)
pizza_done.connect(callback)

触发自定义信号

在业务逻辑需要的位置,导入自定义信号并调用 send 方法触发。发送时需指定 sender 以及定义信号时声明的参数:

from 路径 import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)

总结

Django 的信号机制是框架解耦的核心工具。内置信号简化了常见操作的监听,而自定义信号则允许开发者在任意业务节点插入逻辑。合理使用信号,可以编写出更清晰、更易维护的代码。

以上就是 Django 框架信号调度原理解析的详细内容,更多关于 Django 信号机制的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。