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)
    

results matching ""

    No results matching ""