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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值