zoukankan      html  css  js  c++  java
  • django中的信号

    一些动作发生的时候,系统会根据信号定义的函数执行相应的操作

          通俗的讲,django的信号机制就是事件驱动模型,一个事件可以被多个函数注册,当一个动作行为触发了这个事件后,这个事件所对应的函数便执行相应的操作:

    在django中自定义一个信号如下所示:

               第一步:定义一个信号

                 from django.dispatch import Signal,receiver

                  #定义一个信号
                 signal_jay=Signal(providing_args=['jay'])

                 以上代码即相当于定义了一个事件

    那么有了一个事件原型的定义后,需要添加一个注册于该事件的函数来完成相应功能:

    即在第二步中:

                         定义一个准备注册到该事件的函数

    第三步:

                   将函数注册到事件,所对应的在django中就是应用装饰器@receiver(signal_jay)

    @receiver(signal_jay)
    def signal_callback(sender, **kwargs):
    import time
    time.sleep(10)
    print(sender, kwargs)
    print('signal_callback called')

    @receiver(signal_jay)
    def signal_jay_call_2(sender,**kwargs):
    print(sender,kwargs)
    print('singal2_called')

    在以上代码中,@receiver(signal_jay) 部分的代码即将被装饰的函数注册到所定义的signal_jay事件中

    第四步:

                 在业务逻辑中,解发该事件

                def index(request):
                         #事件通知
                         signal.signal_jay.send(sender='宝宝信号', jay='test')
                         return HttpResponse('ok')

                #取消息事件绑定
               def disConnectionSignal(request):
                           signal.signal_jay.disconnect(signal.signal_jay_call_2)
                           print('取消了signal_jay_call_2')
                          return HttpResponse('ok')

    在django中提供了很多的可用的钩子以供扩展,这些钩子在django中以信号的形式存在,内置的信号有以下类型

    
    

    Django中内置的signal

    
    

    Model_signals

    
    
    pre_init                        # Django中的model对象执行其构造方法前,自动触发
    post_init                       # Django中的model对象执行其构造方法后,自动触发
    pre_save                        # Django中的model对象保存前,自动触发
    post_save                       # Django中的model对象保存后,自动触发
    pre_delete                      # Django中的model对象删除前,自动触发
    post_delete                     # Django中的model对象删除后,自动触发
    m2m_changed                     # Django中的model对象使用m2m字段操作数据库的第三张表(add,remove,clear,update),自动触发
    class_prepared                  # 程序启动时,检测到已注册的model类,对于每一个类,自动触发
    
    

    Managemeng_signals

    
    
    pre_migrate                     # 执行migrate命令前,自动触发
    post_migrate                    # 执行migrate命令后,自动触发 
    
    

    Request/response_signals

    
    
    request_started                 # 请求到来前,自动触发
    request_finished                # 请求结束后,自动触发
    got_request_exception           # 请求异常时,自动触发
    
    

    Test_signals

    
    
    setting_changed                 # 配置文件改变时,自动触发
    template_rendered               # 模板执行渲染操作时,自动触发
    
    

    Datebase_Wrapperd

    
    
    connection_created              # 创建数据库连接时,自动触发


    以下代码中便是对models模型保存前的预留的钩子进行了相应的扩展

    @receiver(pre_save,sender=new_book)
    def pre_save_callback(sender,**kwargs):
    '''
    保存前的钩子
    sender=new_book接收new_book模型的信号
    :param sender:
    :param kwargs:
    :return:
    '''
    print('pre_save_callback')
    print(sender,kwargs)

    @receiver(post_save,sender=new_book)
    def post_save_callback(sender,**kwargs):
    '''
    对模型new_book保存后的钩子
    sender=new_book接收new_book模型的信号
    :param sender:
    :param kwargs:
    :return:
    '''
    print('post_save_callback')
    print(sender,kwargs)

    @receiver(post_save,sender=new_book)    sender=new_book表示监听new_book模型的事件
     
     
  • 相关阅读:
    关于HashMap根据Value获取Key
    关于反射小总结
    关于FastStone Capture输入中文出现乱码.
    关于cmd模式下切换目录
    关于Java的权限修饰符(public,private,protected,默认friendly)
    [设计模式]<<设计模式之禅>>关于里氏替换原则
    [设计模式]<<设计模式之禅>>之关于单一职责原则
    关于eclipse中删除多余的工作空间记录
    关于网络连接方式的总结(HostOnly,NAT....)
    [BigData]关于Hadoop学习笔记第四天(PPT总结)(一)
  • 原文地址:https://www.cnblogs.com/lijintian/p/8811149.html
Copyright © 2011-2022 走看看