Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
也就是当程序有指定动作时,触发一个信号函数
1、Django内置信号
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 # 创建数据库连接时,自动触发
信号的使用
首先在app项目的__init__.py 这个文件,设置信号行为,因为这个文件是所有操作都会经过的
1、在__init__.py导入信号模块
2、自定义信号执行函数
3、将信号执行函数注册到信号
注意:
1、自定义信号执行函数,有两个固定参数sender, **kwargs
sender:返回触发信号执行函数的,对象或方法
kwargs:触发信号执行函数的,对象或方法传过来的数据
connect()注册信号执行函数到信号里
使用方式:
信号名称.connect(自定义信号执行函数名称)
from django.core.signals import request_finished from django.core.signals import request_started #有请求是触发信息 from django.core.signals import got_request_exception from django.db.models.signals import class_prepared from django.db.models.signals import pre_init, post_init from django.db.models.signals import pre_save, post_save from django.db.models.signals import pre_delete, post_delete from django.db.models.signals import m2m_changed from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed from django.test.signals import template_rendered from django.db.backends.signals import connection_created def callback(sender, **kwargs): #自定义信号函数 print("执行信号函数") # print(sender) #打印触发信号的对象或方法 # print(kwargs) #触发者传过来的数据 request_started.connect(callback) #将自定义信号函数注册到信号
2、自定义信号
自定义信号需要我们手动触发
a. 定义信号模块
import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) #定义一个信号,触发时必须传两个参数
b. 注册信号
def callback(sender, **kwargs): print("callback") print(sender,kwargs) pizza_done.connect(callback)
c. 触发信号
from 路径 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)