django的信号量
一、关于django
信号量官网单位
Django
包含一个"信号调度程序",它有助于在框架中的其他位置发生操作时通知分离的应用程序。简而言之,信号允许某些发送者通知一组接收器已经发生了某些动作。当许多代码可能对同一事件感兴趣时,它们特别有用.
二、django
中内置的信号量
1、
Model
的信号量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类,对于每一个类,自动触发from django.db.models.signals import class_prepared from django.db.models.signals import pre_init from django.db.models.signals import post_init from django.db.models.signals import pre_save from django.db.models.signals import post_save from django.db.models.signals import pre_delete from django.db.models.signals import post_delete from django.db.models.signals import m2m_changed
2、
Management
的信号量pre_migrate
# 执行migrate命令前,自动触发post_migrate
# 执行migrate命令后,自动触发from django.db.models.signals import pre_migrate from django.db.models.signals import post_migrate
3、
Request/Response
的信号量request_started
# 请求到来前,自动触发request_finished
# 请求结束后,自动触发got_request_exception
# 请求异常后,自动触发from django.core.signals import request_finished from django.core.signals import request_started from django.core.signals import got_request_exception
4、
Test
的信号量setting_changed
# 使用test测试修改配置文件时,自动触发template_rendered
# 使用test测试渲染模板时,自动触发from django.test.signals import setting_changed from django.test.signals import template_rendered
5、
Database
的信号量connection_created
# 创建数据库连接时,自动触发from django.db.backends.signals import connection_created
三、在django
中使用connect
定义信号量
1、官网案例
要接收信号,请使用该方法注册接收器功能 Signal.connect()。发送信号时调用接收器功能。
Signal.connect(receiver,sender = None,weak = True,dispatch_uid = None)
receiver
- 将连接到此信号的回调函数。有关更多信息,请参阅接收器功能。sender
- 指定从中接收信号的特定发送方。有关详细信息,请参阅 连接到特定发件人发送的信号。weak
-Django
默认将信号处理程序存储为弱引用。因此,如果您的接收器是本地功能,它可能是垃圾收集。为防止这种情况,请weak=False
在调用信号connect()
方法时通过。dispatch_uid
- 在可能发送重复信号的情况下信号接收器的唯一标识符。有关更多信息,请参阅 防止重复信号。
2、自己定义一个数据库保存前后的信号(在项目的
__init__.py
文件中定义)from django.db.models import signals def before_save(*args, **kwargs): """ 定义一个数据保存之前触发的信号 :param args: :param kwargs: :return: """ print('===数据保存之前触发===') print(args, kwargs) print('===数据保存之前触发===') def post_save(*args, **kwargs): """ 定义一个数据保存之后触发的信号 :param args: :param kwargs: :return: """ print('==数据保存之后触发==') print(args, kwargs) print('==数据保存之后触发==') signals.pre_save.connect(before_save) signals.post_save.connect(post_save)
3、测试
四、使用receiver
装饰器定义信号量
- 1、同样在项目的
__init__.py
文件中 2、导包
from django.core.signals import request_finished from django.dispatch import receiver
3、定义信号量函数
@receiver(request_finished) def my_callback(sender, **kwargs): print('-' * 100) print(sender, kwargs) print("Request finished!")
不指定接受信号者就是作用于全局,一般直接写在项目的__init__.py
文件中,如果是仅仅针对个别app
来说的,不会全局配置
五、关于指定接收者(组件的信号量)
1、在组件中创建一个
signals.py
文件2、
signals.py
中写上信号的接收者from django.db.models import signals from app01.models import ClassModel, StudentModle def before_save(*args, **kwargs): """ 定义一个数据保存之前触发的信号 :param args: :param kwargs: :return: """ print('===数据保存之前触发===') print(args, kwargs) print('===数据保存之前触发===') signals.pre_save.connect(before_save, sender=ClassModel)
3、如果是使用装饰器的方式
from django.core.signals import request_finished from django.dispatch import receiver from .views import app02Test @receiver(request_finished, sender=app02Test) def my_callback(sender, **kwargs): print('-' * 100) print(sender, kwargs) print("Request finished!")
六、自定义信号
1、在
app
中创建一个文件2、在文件中自定义信号
# 定义信号 import django.dispatch pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) # 注册信号 def callback(sender, **kwargs): print("callback") print(sender, kwargs) pizza_done.connect(callback)
3、在视图中发送信号
from .文件 import pizza_done pizza_done.send(sender='seven', toppings=123, size=456)