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模型的事件