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>
posted @ 2020-11-16 14:01  Leviathangk  阅读(229)  评论(0)    收藏  举报