django的signals
1、概述
信号可以在框架中的其他位置发生操作时通知分离的应用程序,简而言之,就是信号允许特定的sender通知一组receiver某些操作已经发生,这在多处代码和同一事件有关联的情况下很有用。
2、内置信号
内置信号的完整文档:https://docs.djangoproject.com/zh-hans/2.2/ref/signals/
模型层中定义的内置信号,在 django.db.models.signals 模块中:
- pre_init:实例化模型时,此信号在模型的__init__()方法的开头发送
此信号发送的参数:
- instance:模型类
- args:模型初始化的位置参数
- kwargs:模型初始化的关键字参数
- post_init:和pre_init一样,但是这个__init__()方法在方法完成时发送
此信号发送的参数:
- instance:刚刚初始化完成的模型实例
- pre_save:在模型 save()方法开始时发送
- post_save:在模型 save()方法完成时发送
- pre_delete:在模型 delete()方法开始时发送
- post_delete:在模型 delete()方法结束时发送
- m2m_changed:多对多关系中,模型更改时发送
对web请求,也有内置信号,在 django.core.signals 模块中
- request_started:Django开始处理HTTP请求时发送
- request_finished:当Django完成向客户端发送HTTP响应时发送
3、定义信号
所有的信号都是django.dispatch.Signal实例
初始化参数:providing_args=None, use_caching=False
- providing_args:信号将为sender提供的参数名称列表
- use_caching:默认为False,是否使用缓存,设置为True,会为每个sender对应的接收器进行缓存(保存到sender_receivers_cache),调用 .connect() 或 .disconnect() 后会清除缓存。内置信号基本都设置为True
示例:
from django import dispatch
pizza_done = dispatch.Signal(providing_args=["toppings", "size"])
4、接收器receiver
接收器可以是任何python函数或方法,参数最少必须是:sender, **kwargs,示例如下: