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模型的事件
 
 
原文地址:https://www.cnblogs.com/lijintian/p/8811149.html