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

    调用内置信号的俩种形式

    2,django自定义信号

    1 )、定义信号

    所有的信号都是 `django.dispatch.Signal` 的实例、那么在项目某个app下创建 名为 `custom_signals.py` 的文件,如下这么写

    # filename: custom_singals.py
    
    import django.dispatch
    
    # 声明了一个 `pizza_done` 信号,它将为接收者提供 `toppings`, `size` 参数
    # 可以在任何时候更改这个参数列表
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

    并配置信号回调函数

    在项目某个app下创建 名为 `register.py` 的文件,如下这么写

    # filename: register.py
    # 注册信号使用
    
    from app01.custom_singals import pizza_done
    
    
    def pizza_done_func(sender, **kwargs):
        print("msg:", sender, kwargs)
    
    
    pizza_done.connect(pizza_done_func)

    2 )、注册信号

    项目启动的时候要将这些信号注册,那么在对应 `app` 的 `apps.py` 文件中如下

    # filename: app_name/apps.py
    
    from django.apps import AppConfig
    
    # `django` 工具包中封装好的动态导入模块的方法
    from django.utils.module_loading import import_module  
    
    
    class App01Config(AppConfig):
        name = 'app01'
    
        def ready(self):
            # 项目启动所有 `app` 的 `ready` 方法下的代码均会执行
            import_module("app01.register")  # 注册信号

    3 )、发送信号

    事先定义 一组 `url` 映射关系,在视图业务操作中发送我们的信号( 有俩种发送信号的方法 )

    from django.shortcuts import HttpResponse
    
    from app01.custom_singals import pizza_done
    
    
    # Create your views here.
    
    class PizzaStore:
    
        def send_pizza(self, toppings, size):
            # 发送信号
            pizza_done.send(sender=self.__class__, toppings=toppings, size=size)
            # "OR"   上下俩个方法是等价的, 区别 ~ ~
            pizza_done.send_robust(sender=self.__class__, toppings=toppings, size=size)
    
    
    def index(request, ):
        # 业务操作, 执行信号发送操作
        PizzaStore().send_pizza("chicken", "40")
        return HttpResponse("ok")
  • 相关阅读:
    阿里图标库引用简介---20200608更新
    2.10排序算法
    2.9Node节点的学习
    2.8DOM节点的学习
    2.5数组
    2.6对象和函数
    2.7变量、内存、Math和Date的初级认识
    css优先级问题
    事件委托(事件代理)初认识
    静态页面学习随笔(1)-如何正确布局大体结构
  • 原文地址:https://www.cnblogs.com/129TL/p/10156212.html
Copyright © 2011-2022 走看看