zoukankan      html  css  js  c++  java
  • django信号机制 (每个操作前后django都预留了两个钩子,便于统一化添加功能)

    信号

    Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

    典型应用场景:在所有数据库相关操作(读/写) 前后都各记录一条日志

    1、Django内置信号

    Model signals
        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类,对于每一个类,自动触发
    Management signals
        pre_migrate                 # 执行migrate命令前,自动触发
        post_migrate                # 执行migrate命令后,自动触发
    Request/response signals        #【在中间件前就执行】
        request_started             # 请求到来前,自动触发
        request_finished            # 请求结束后,自动触发
        got_request_exception       # 请求异常后,自动触发
    Test signals
        setting_changed             # 使用test测试修改配置文件时,自动触发
        template_rendered           # 使用test测试渲染模板时,自动触发
    Database Wrappers
        connection_created          # 创建数据库连接时,自动触发

     对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

    from django.core.signals import request_finished
        from django.core.signals import request_started
        from django.core.signals import got_request_exception
    
        from django.db.models.signals import class_prepared
        from django.db.models.signals import pre_init, post_init
        from django.db.models.signals import pre_save, post_save
        from django.db.models.signals import pre_delete, post_delete
        from django.db.models.signals import m2m_changed
        from django.db.models.signals import pre_migrate, post_migrate
    
        from django.test.signals import setting_changed
        from django.test.signals import template_rendered
    
        from django.db.backends.signals import connection_created
    
    
        def callback(sender, **kwargs):
            print("xxoo_callback")
            print(sender,kwargs)
    # sender代表 触发者,
    # **kwargs 代表触发时传递的参数 xxoo.connect(callback) # 向xxoo信号类型注册信号函数
    # xxoo指上述导入的内容
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")

    2、自定义信号

    a. 定义信号

    import django.dispatch
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
    toppings、size 代表触发信号要传递的参数
    pizza_done 为自定义信号名

    b. 向信号中注册函数

    def callback(sender, **kwargs):
        print("callback")
        print(sender,kwargs)
     
    pizza_done.connect(callback)

    c. 触发信号

    from 路径 import pizza_done
     
    pizza_done.send(sender='seven',toppings=123, size=456)

     自定义信号案例

    在manager.py 同级目录下创建 sg.py

    sg.py

    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)

    views.py 中手动触发信号

    def signal(request):
        from session_study import models
    
        obj = models.UserInfo(user='root')
        print('end')
        obj.save()
        
        # 手动触发信号
        from sg import pizza_done
        
        pizza_done.send(sender='随便写表示发送信号的源', toppings='toppings', size='size')
    
        return HttpResponse('ok')

    自定义信号应用场景:

    例如自己做一个监控,监控某个监控项到达一个阈值,触发一条告警。在告警动作中手动触发这个信号。以后只要是发告警就会自动触发自定义的信号。信号中到底做什么事儿。就自己随便注册了。例如发短信. 发微信. 发邮件等等 ...

  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/13363552.html
Copyright © 2011-2022 走看看