Django-16-信号signals
信号 4 大步骤:创建信号、接收信号、注册信号、发送信号。
注意:内置信号不需要创建,直接执行接收信号、注册信号两大步骤。
一、创建信号
一般在子应用下创建 signals.py 使用 dispatch.Signal 创建。
from django import dispatch
信号名称 = dispath.Signal(providing_args=['这是一个参数列表'], use_caching=False)
参数说明:
providing_args: 信号将为 sender 提供的参数名称列表
use_caching: 默认为 False,是否使用缓存,设置为 True,会为每个 sender 对应的接收器进行缓存(保存到sender_receivers_cache),调用 .connect() 或 .disconnect() 后会清除缓存。内置信号基本都设置为 True。
二、接收信号
在 signals 中,定义一个接收器,参数最少必须是:sender, **kwargs。
def 接收器函数名(sender, **kwargs):
print("我是接收器函数!")
参数说明:
sender: 信号的发送对象,其实可以是任意对象,取决于发送时传递的参数
**kwargs: 信号对象定义时的 providing_args 指定的参数
三、注册信号
注册信号的作用是将信号与接收器关联起来。
1. connect 方法
使用该方法的注册,都在子应用下的 apps.py 中的 ready 函数中注册,不需要写 dispatch_uid 来防止重复信号。
from django.core.signals import 信号名称
信号名称.connect(接收信号的函数名)
2. receiver 装饰器
可以在任意地方,跟在接收信号的上面。
from django.dispatch import receiver
@receiver(信号名称, **kwargs) # 普通注册
@receiver(信号名称, dispatch_uid="子应用名_函数名") # 一般添加 dispatch_uid 来防止重复信号
@receiver(信号名称, sender=指定信号发送方) # 只接收指定信号
参数说明:
signal: 信号对象或信号对象列表
**kwargs: 这个装饰器也是使用的connect方法,这个关键字参数就是传递给connect方法的关键字参数
四、发送信号
发送信号,写在需要执行的位置,一般使用关键字参数。
信号名称.send(sender='自定义发送者', **kwargs)
PS:内置信号
内置信号的完整文档: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__() 方法在 pre_init 方法完成后才发送此信号发送的参数:
instance: 刚刚初始化完成的模型实例<br>
pre_save: 在模型 save() 方法开始时发送
post_save: 在模型 save() 方法完成时发送
pre_delete: 在模型 delete() 方法开始时发送
post_delete: 在模型 delete() 方法结束时发送<br>
m2m_changed: 多对多关系中,模型更改时发送对 web 请求,也有内置信号,在 django.core.signals 模块中。
request_started: Django 开始处理 HTTP 请求时发送
request_finished: 当 Django 完成向客户端发送HTTP响应时发送 <br>

浙公网安备 33010602011771号