微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django中的信号

<div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown">

Django中内置的signal

Django中提供了"信号调度",用于在框架执行操作时解耦.

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

Model_signals

copy">
pre_init                        方法前,自动触发
post_init                       方法后,自动触发
pre_save                        自动触发
post_save                       自动触发
pre_delete                      删除前,自动触发
post_delete                     删除后,自动触发
m2m_changed                     数据库的第三张表(add,remove,clear,update),自动触发
class_prepared                  注册的model类,对于每一个类,自动触发
copy">

Managemeng_signals

pre_migrate 自动触发 post_migrate 自动触发

Request/response_signals

request_started 自动触发 request_finished 自动触发 got_request_exception 自动触发

Test_signals

setting_changed 配置文件改变时,自动触发 template_rendered 自动触发

Datebase_Wrapperd

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

注册指定信号,当程序执行相应操作时,系统会自动触发注册函数

数据库记录,触发pre_savepost_save信号

创建一个Django项目,配置好路由映射

models.py中的代码:

django.db <span style="color: #0000ff;">class<span style="color: #000000;"> UserInfo(models.Model):
name
=models.CharField(max_length=32<span style="color: #000000;">)
pwd=models.CharField(max_length=64)

views.py中的代码:

copy">
 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;">")

<div class="cnblogs_code_toolbar"><span class="cnblogscodecopy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

项目的__init__.py文件代码:

copy">
 django.db.models.signals <span style="color: #0000ff;">def pre_save_func(sender,**<span style="color: #000000;">kwargs):

</span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;pre_save_func</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;)
</span><span style="color: #0000ff;"&gt;print</span>(<span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;pre_save_msg:</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;,sender,<a href="/tag/kwargs/" target="_blank" class="keywords">kwargs</a>)

<span style="color: #0000ff;">def post_save_func(sender,**<span style="color: #000000;">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对象保存后触发函数


<div class="cnblogs_code_toolbar"><span class="cnblogscodecopy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

创建一个index.html网页,用浏览器打开这个项目,在服务端后台打印信息如下:

copy">
< > {: : ,: 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;">'
}

<div class="cnblogs_code_toolbar"><span class="cnblogscodecopy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

比较打印的结果,可以看到models对象保存后,在打印信息里包含一个"create=True"的键值对.

也可以使用装饰器来触发信号,把上面__init__.py中的代码修改:

copy">
 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;">")

<div class="cnblogs_code_toolbar"><span class="cnblogscodecopy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

则在本次请求结束后自动触发callback函数,在后台打印"Request finished!"这句话.

自定义信号

1.定义信号

新建一个项目,配置好路由,在项目根目录下创建一个singal_test.py文件,内容

dispatch

action=django.dispatch.Signal(providing_args=[<span style="color: #800000;">"<span style="color: #800000;">aaaa<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">bbbb<span style="color: #800000;">"])

2.注册信号

项目应用下面的__init__.py文件内容:

copy">
 singal_test <span style="color: #0000ff;">def pre_save_func(sender,kwargs)

action.connect(pre_save_func)


<div class="cnblogs_code_toolbar"><span class="cnblogscodecopy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

3.触发信号

views视图函数内容:

singal_test action.send(sender=<span style="color: #800000;">"<span style="color: #800000;">python<span style="color: #800000;">",aaa=<span style="color: #800000;">"<span style="color: #800000;">111<span style="color: #800000;">",bbb=<span style="color: #800000;">"<span style="color: #800000;">222<span style="color: #800000;">")

用浏览器打开index.html网页,后台打印信息如下:

: ,: ,: }

由于内置信号的触发者已经集成到Django中,所以会自动调用,而对于自定义信号需要在任意位置触发

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐