zoukankan      html  css  js  c++  java
  • 24)django-信号

    目录

      1)django信号简介

      2)django内置信号

      3)django自定义信号

    一:django信号简介

      Django中提供了“信号调度”,用于在框架执行操作时解耦。

      通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

      信号适用场景:比如监控阀值,可以让做某个操作。比如运维监控,当触发到阀值,发短信,邮件等报警。

      django在对象创建保存预留了4个钩子,可以用来操作,即可以对象创建保存时候调用内置信号,触发其他动作。

        obj=models.UserInfo(name="name") django在这前后刘了两个钩子 这里是model一个构造方法
        
        obj.save()django在这前后刘了两个钩子

    二: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)
    
        xxoo.connect(callback)
        # xxoo指上述导入的内容
    我们要做的,就是注册一个receiver函数。例如,如果要在每次请求完成之后,打印一行字。
    可以使用回调的方式注册:
    
    # receiver
    def my_callback(sender, **kwargs):
      print("Request finished!")
      
    # connect
    from django.core.signalsimport request_finished
      
    request_finished.connect(my_callback)
    也可以使用装饰器的方式注册,下面这段代码和上面完全是等价的。
    
    from django.core.signalsimport request_finished
    from django.dispatchimport receiver
      
    @receiver(request_finished)
    def my_callback(sender, **kwargs):
      print("Request finished!")

    三:自定义信号

      分为三个步骤:  

      1)创建信号
      2)注册信号
      3)触发信号

      

      1)创建信号

      

    import django.dispatch 

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

      2)注册信号

      

    #信号注册
        1)在工程名同名下的__init__.py导入信号类,比如
        文件名sg.py
        import sg
    #上面要导入不然会找不到自定义的信号
    def my_callback(sender, **kwargs):
        print("Request finished!")
    pizza_done.connect(my_callback)
     

      3)触发信号

      

        from sg import pizza_done
        pizza_done.send(sender="11",topping=123,size=456)触发信号。

     四:示例

      1)内置信号使用

      2)自定义信号

    #urls.py
    
    from app01 import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^user_add/', views.user_add),
    ]
    
    #models.py
    class User(models.Model):
        username=models.CharField(max_length=32)
        password=models.CharField(max_length=32)
    
    #自定义信号sg.py
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    import django.dispatch
    #自定义信号pizza_done
    pizza_done=django.dispatch.Signal(providing_args=["name","pwd"])#name和pwd是自定义传递的参数
    
    #在同工程名__init__.py
    import sg
    #如果这里不导入,使用自定义信号报错
    
    
    
    #views.py
    from django.shortcuts import render,HttpResponse
    from app01 import models
    # Create your views here.
    #自定信号模块
    import sg
    def my_callback_post_save(*args,**kwargs):
        print("保存数据后触发的信号。。。后。。")
    
    def my_callback_pre_save(*args,**kwargs):
        print("保存数据前触发的信号。。。前。。")
    
    #保存数据后出触发信号 导入
    from django.db.models.signals import post_save,pre_save
    
    pre_save.connect(my_callback_pre_save)
    post_save.connect(my_callback_post_save)
    
    #自定义信号pizza_done的回调函数
    def my_callback(sender,*args,**kwargs): #sender是必须有的参数
        print("自定义信号",sender,kwargs)
    
    #给自定信号pizza_done增加回调函数
    sg.pizza_done.connect(my_callback)
    
    def user_add(request):
    
        # user_obj=models.User(username="root",password="123")
        # print("save before")
        # user_obj.save()
        # #给信号注册回调函数
        # print("save end")
        models.User.objects.create(username="root",password="123")
    
        #手动触发自定义信号
        sg.pizza_done.send(sender="semder",name="root",pwd="123")
        return HttpResponse("OK")
    View Code

      结果

    保存数据前触发的信号。。。前。。
    [19/Nov/2017 11:30:16] "GET /user_add/ HTTP/1.1" 200 2
    保存数据后触发的信号。。。后。。
    自定义信号 semder {'signal': <django.dispatch.dispatcher.Signal object at 0x0000000003F2B278>, 'name': 'root', 'pwd': '123'}
    View Code
  • 相关阅读:
    深入学习Spring框架(四)- 事务管理
    深入学习Spring框架(三)- AOP面向切面
    深入学习Spring框架(二)- 注解配置
    深入学习Spring框架(一)- 入门
    深入学习Mybatis框架(二)- 进阶
    深入学习Mybatis框架(一)- 入门
    短uuid生成
    from __future__ import division
    django-orm 快速清理migrations缓存
    Ajax请求设置csrf_token
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7856636.html
Copyright © 2011-2022 走看看