zoukankan      html  css  js  c++  java
  • 十六 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          # 创建数据库连接时,自动触发
    复制代码

    信号的使用

    首先在app项目的__init__.py 这个文件,设置信号行为,因为这个文件是所有操作都会经过的

    1、在__init__.py导入信号模块

    2、自定义信号执行函数

    3、将信号执行函数注册到信号

    注意:

      1、自定义信号执行函数,有两个固定参数sender, **kwargs

      sender:返回触发信号执行函数的,对象或方法

      kwargs:触发信号执行函数的,对象或方法传过来的数据

    connect()注册信号执行函数到信号里
    使用方式:
    信号名称.connect(自定义信号执行函数名称)

    复制代码
    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("执行信号函数")
        # print(sender)   #打印触发信号的对象或方法
        # print(kwargs)   #触发者传过来的数据
    
    
    request_started.connect(callback)   #将自定义信号函数注册到信号
    复制代码

    2、自定义信号

    自定义信号需要我们手动触发

    a. 定义信号模块

    import django.dispatch  
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])  #定义一个信号,触发时必须传两个参数

    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)
  • 相关阅读:
    linux php.ini又一次载入问题
    String、StringBuilder、 StringBuffer 深入分析 源代码解析
    hdu 4902 Nice boat(线段树区间改动,输出终于序列)
    鸿雁电器oa系统中决策支持模块效果
    POJ3321:Apple Tree(树状数组)
    ASP.NET六大巨头——内置对象(1)
    insmod hello.ko -1 Invalid module format最简单的解决的方法
    poj
    iOS项目开发实战——制作视图的缩放动画
    读配置文件能够保持顺序的 Java Properties 类
  • 原文地址:https://www.cnblogs.com/meng-wei-zhi/p/8183140.html
Copyright © 2011-2022 走看看