Django信号就是框架在执行过程中一些动作发生的时候允许特定的一些发送者去执行一定的函数和功能
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 # 创建数据库连接时,自动触发
信号和中间件的区别
中间件:只在入口和出口
信号:在内部有很多,几乎每个操作都有
使用方法
# 导入数据库
import pymysql
pymysql.install_as_MySQLdb()
# 导入内置信号
from django.db.backends.signals import xxoo
# 写执行内容
def callback(sender, **kwargs):
print("xxoo_callback", sender, kwargs)
print(sender,kwargs)
# 也可以执行多个函数
def callback1(sender, **kwargs):
print("xxoo_callback", sender, kwargs)
print(sender,kwargs)
xxoo.connect(callback)
xxoo.connect(callback1)
- 为了保证在程序运行的时候就执行信号,可以将信号写入init.py 文件里面
- 所有信息都封装在sender以及kwargs里面
- 如果需要添加或者删除某个功能的话,可以直接对函数进行操作,不用修改原来的代码
自定义信号
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)
由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。