zoukankan      html  css  js  c++  java
  • pythonのdjango 信号

    一、内置信号

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

     1 Model signals
     2     pre_init                    # django的modal执行其构造方法前,自动触发
     3     post_init                   # django的modal执行其构造方法后,自动触发
     4     pre_save                    # django的modal对象保存前,自动触发
     5     post_save                   # django的modal对象保存后,自动触发
     6     pre_delete                  # django的modal对象删除前,自动触发
     7     post_delete                 # django的modal对象删除后,自动触发
     8     m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
     9     class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
    10 Management signals
    11     pre_migrate                 # 执行migrate命令前,自动触发
    12     post_migrate                # 执行migrate命令后,自动触发
    13 Request/response signals
    14     request_started             # 请求到来前,自动触发
    15     request_finished            # 请求结束后,自动触发
    16     got_request_exception       # 请求异常后,自动触发
    17 Test signals
    18     setting_changed             # 使用test测试修改配置文件时,自动触发
    19     template_rendered           # 使用test测试渲染模板时,自动触发
    20 Database Wrappers
    21     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)
    
        xxoo.connect(callback)
        # xxoo指上述导入的内容
    from django.core.signals import request_finished
    from django.dispatch import receiver
    
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
        print("Request finished!")

    二、自定义信号

    1.定义信号

    import django.dispatch
    pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

    2.注册信号

    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)

    由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发

    更多:猛击这里

    原文摘自:https://www.cnblogs.com/wupeiqi/articles/5246483.html

    三、使用步骤

    1.首先创建一个.py文件(apsingnals.py),将需要的相关信号导入进该文件。

    #!/usr/bin/env python
    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 # 程序启动时,检测已注册的app中的model类,对于每一个类自动触发
    from django.db.models.signals import pre_init, post_init # pre_init django的model执行其构造方法前自动触发 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 # 在model中使用m2m字段操作第三表(add remove clear)前后,自动触发
    from django.db.models.signals import pre_migrate, post_migrate # 执行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("触发了callback方法")
    # 需要使用的事件(pre_save)以及 触发后调用的方法callback
    pre_save.connect(callback)

    2.当完成上述步骤操作后,需要在程序初始化的时候调用该模块,在项目同名文件夹中找到init.py文件引入信号.py文件(apsingnals.py)

    import appsignals

    3.由于上述步骤我们演示的是在保存前执行,所以我们在保存后执行一段代码,对比下

    from app01 import models
    def add(request):
        model = models.UserInf()
        model.username = "tom"
        model.email = "40@qq.com"
        model.save()
        print("保存成功!")
        return HttpResponse("OK")

    4.运行

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/pengpengzhang/p/10209057.html
Copyright © 2011-2022 走看看