Django中的信号

前端之家收集整理的这篇文章主要介绍了Django中的信号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<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                     数据库的第三张表(add,remove,clear,update),自动触发
class_prepared                  注册的model类,对于每一个类,自动触发

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

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

猜你在找的Django相关文章