Django:信号的使用
信号
- Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
- 应用:比如插入数据到数据库,插入之前写日志,插入之后写日志。
Model signals
pre_init # django的model执行其构造方法前,自动触发
post_init # django的model执行其构造方法后,自动触发
pre_save # django的model对象保存前,自动触发
post_save # django的model对象保存后,自动触发
pre_delete # django的model对象删除前,自动触发
post_delete # django的model对象删除后,自动触发
m2m_changed # django的model中使用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 # 创建数据库连接时,自动触发
1.信号用法一:
-
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数,注册信号,写入与project同名的文件夹下的
__init__.py
文件中,也是换数据库引擎的地方。这里拿post_save举例__init__.py
# post_save:django的model对象保存后,自动触发 from django.db.models.signals import post_save def callback(sender,**kwargs): print("执行post_save信号") print(sender,kwargs) post_save.connect(callback)#信号连接,并调用回调函数
- views.py
def student_list(request): students = models.Student.objects.all() print(students) models.Student.objects.create(name='xxoo')#创建一个对象,用于触发信号 return render(request,'stu.html',{"students":students})
2.信号用法二:
- 通过装饰器receiver,也可以添加多个信号
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save)# django的model对象保存后,自动触发
def callback(sender,**kwargs):
print("执行post_save信号")
print(sender,kwargs)
post_save.connect(callback)
@receiver(pre_save)# django的model对象保存前,自动触发
def callback2(sender,**kwargs):
print("执行pre_save信号")
print(sender,kwargs)
pre_save.connect(callback2)
3.自定义信号:
- 在一个py文件定义信号!sig.py
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])#toppings,size自己定义字段
- 在
__init__.py
中注册信号
from sig import pizza_done
def callback(sender, **kwargs):
print("callback")
print(sender, kwargs)
pizza_done.connect(callback)
#触发后打印结果:
callback
seven {'signal': <django.dispatch.dispatcher.Signal object at 0x000001BCD6D82B38>, 'toppings': 123, 'size': 456}
-
在视图函数触发信号由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发
from django.shortcuts import render from app01 import models from sig import pizza_done def student_list(request): students = models.Student.objects.all() pizza_done.send(sender='seven', toppings=123, size=456)#给sig中定义的字段传值,发起信号者赋值 return render(request,'stu.html',{"students":students})
触发信号:单独写文件,如果在视图函数写函数,当代码取消,不方便。如果单独写函数,虽然添加信号会繁琐,但功能不需要取消时候,就方便许多。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库