Django 信号机制:内置信号与自定义信号实现解耦
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 信号机制的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













