加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django中的信号

发布时间:2020-12-15 17:20:26 所属栏目:大数据 来源:网络整理
导读:div id="cnblogs_post_body" class="blogpost-body cnblogs-markdown" Django中内置的signal Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Model_signals pre_init post_init pre_save p

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

Django中内置的signal

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

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

Model_signals

pre_init                        
post_init                       
pre_save                        
post_save                       
pre_delete                      
post_delete                     
m2m_changed                     
class_prepared                  

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_save和post_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中的代码:

 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="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

项目的__init__.py文件中代码:

 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,kwargs)

<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="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">复制代码

创建一个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;">'
}

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

比较打印的结果,可以看到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;">")

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

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

自定义信号

1.定义信号

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

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文件内容:

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

action.connect(pre_save_func)


<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><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中,所以会自动调用,而对于自定义信号需要在任意位置触发

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读