<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown">
Django中内置的signal
Django中提供了"信号调度",用于在框架执行操作时解耦.
一些动作发生的时候,系统会根据信号定义的函数执行相应的操作
Model_signals
<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown">
Django中提供了"信号调度",用于在框架执行操作时解耦.
一些动作发生的时候,系统会根据信号定义的函数执行相应的操作
Model_signals
pre_init 方法前,自动触发
post_init 方法后,自动触发
pre_save 自动触发
post_save 自动触发
pre_delete 删除前,自动触发
post_delete 删除后,自动触发
m2m_changed 数据库的第三张表(add,remove,clear,update),自动触发
class_prepared 注册的model类,对于每一个类,自动触发
Managemeng_signals
Request/response_signals
Test_signals
Datebase_Wrapperd
数据库记录,触发pre_save
和post_save
信号
创建一个Django项目,配置好路由映射
models.py
中的代码:
views.py
中的代码:
django.shortcuts app01 <span style="color: #0000ff;">def<span style="color: #000000;"> index(request):
models.UserInfo.objects.create(name=<span style="color: #800000;">"<span style="color: #800000;">MysqL<span style="color: #800000;">",pwd=<span style="color: #800000;">"<span style="color: #800000;">MysqL123<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">return HttpResponse(<span style="color: #800000;">"<span style="color: #800000;">ok<span style="color: #800000;">")
django.db.models.signals <span style="color: #0000ff;">def pre_save_func(sender,**<span style="color: #000000;">kwargs):<span style="color: #0000ff;">def post_save_func(sender,**<span style="color: #000000;">kwargs):</span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">pre_save_func</span><span style="color: #800000;">"</span><span style="color: #000000;">) </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">pre_save_msg:</span><span style="color: #800000;">"</span><span style="color: #000000;">,sender,kwargs)
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">post_save_func<span style="color: #800000;">"<span style="color: #000000;">)
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">post_save_msg:<span style="color: #800000;">"<span style="color: #000000;">,kwargs)pre_save.connect(pre_save_func) <span style="color: #008000;">#<span style="color: #008000;"> models对象保存前触发callback函数
post_save.connect(post_save_func) <span style="color: #008000;">#<span style="color: #008000;"> models对象保存后触发函数
创建一个index.html
网页,用浏览器打开这个项目,在服务端后台打印信息如下:
< > {: : ,: False,: ,post_save_func
post_save_msg: <<span style="color: #0000ff;">class <span style="color: #800000;">'<span style="color: #800000;">app01.models.UserInfo<span style="color: #800000;">'> {<span style="color: #800000;">'<span style="color: #800000;">signal<span style="color: #800000;">': <django.db.models.signals.ModelSignal object at 0x0000000002E62630><span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">created<span style="color: #800000;">': True,<span style="color: #800000;">'<span style="color: #800000;">update_fields<span style="color: #800000;">' : None,<span style="color: #800000;">'<span style="color: #800000;">using<span style="color: #800000;">': <span style="color: #800000;">' <span style="color: #800000;">default<span style="color: #800000;">'}
比较打印的结果,可以看到models对象保存后,在打印信息里包含一个"create=True"
的键值对.
也可以使用装饰器来触发信号,把上面__init__.py
中的代码修改:
django.core.signals django.dispatch @receiver(request_finished)
<span style="color: #0000ff;">def callback(sender,**<span style="color: #000000;">kwargs):
<span style="color: #0000ff;">print(<span style="color: #800000;">"<span style="color: #800000;">Request finished!<span style="color: #800000;">")
则在本次请求结束后自动触发callback函数,在后台打印"Request finished!"
这句话.
新建一个项目,配置好路由,在项目根目录下创建一个singal_test.py
的文件,内容为
singal_test <span style="color: #0000ff;">def pre_save_func(sender,kwargs)
action.connect(pre_save_func)
用浏览器打开index.html
网页,后台打印信息如下:
由于内置信号的触发者已经集成到Django中,所以会自动调用,而对于自定义信号需要在任意位置触发