序言

Django自带一套信号机制来帮助我们在框架的不同应用位置之间传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将信号(signals)发送给一组接收者(receivers),此时接收者进行一些相关处理动作。

信号系统包含以下三要素:

  • 信号:Signal对象
  • 发送者:信号发出方
  • 接收者:信号接收方

Django内置了一整套信号,下面是一些比较常用的:

  • pre_save & post_save    在ORM模型的save()方法调用之前或之后发送信号
  • pre_delete & post_delete    在ORM模型或查询集的delete()方法调用之前或之后发送信号
  • request_started & request_finished    当接收和关闭HTTP请求时发送信号
  • m2m_changed    当多对多字段被修改时发送信号

以上可以看出,在某种程度上说,信号和数据库触发器有些相似。

接下来看看Django信号如何使用,可分为内置信号和自定义信号。

使用内置信号

内置信号使用起来很简单,最方便的是采用receiver装饰器。

from django.core.signals import request_finished
from django.dispatch import receiver @receiver(request_finished, sender=Myclass)
def signal_handler(sender, **kwargs):      # 接收到信号后,在此处理
print("请求完成!")

装饰器将处理函数注册成接收器,当内置信号发送后,此处理函数立即执行。

使用自定义信号

首先在根URLConf中写一条路由:

# 信号测试
url(r'^signal/$', signal_sender),

自定义一个信号:

from django.dispatch import receiver, Signal

signal_obj = Signal(['hostname', 'msg', 'time'])    # 实例化信号对象,绑定一些信号属性

编写视图:

import datetime
import os
import django
from django.dispatch import receiver, Signal
from django.http import HttpResponse # 发送信号
def signal_sender(request):
hostname = request.get_host()
msg = 'Django Signal Test'
time = datetime.date.today()
signal_obj.send(sender=signal_sender, hostname=hostname, msg=msg, time=time) # 关键一行
return HttpResponse('200 OK') # 接收和处理信号
@receiver(signal_obj, sender=signal_sender) # 装饰器把处理函数注册成接收器
def signal_handler(sender, **kwargs):       # 接收到信号后,在此处理。kwargs字典用来传递Signal信号参数
print('接收到信号内容:{hostname}|"{msg}"|{time}'.format(hostname=kwargs['hostname'], msg=kwargs['msg'], time=kwargs['time']))

现在可以测试一下,python manage.py runserver启动服务器。浏览器中访问 http://127.0.0.1:8000/signal/。重点不在浏览器的返回,而在后台Terminal返回的内容:

接收到信号内容:www.wcwnina.com:8888|"Django Signal Test"|2018-12-08

  至此。转载请注明出处。

Django 信号signal的更多相关文章

  1. django信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  2. Django 详解 信号Signal

    Django信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Model signals pre_init # ...

  3. 23:django 信号(signal)

    django包含了一个“信号分配器”使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些 ...

  4. Django中信号signal针对model的使用

    Django中实现对数据库操作的记录除了使用[开源插件]还可以使用信号signal独立实现 信号机制-观察者模式-发布与订阅:signal - 配置 # 文件路径:Django/myapps/__in ...

  5. 第六章:Django 综合篇 - 8:信号 signal

    django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(rec ...

  6. pythonのdjango 信号

    一.内置信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Model signals pre_init # d ...

  7. django信号浅谈

    Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_in ...

  8. django信号

    什么是信号? 信号是在某个操作前或后自动触发一些操作. 信号是通知,是一种状态,相当于在某种状态下发特定的消息 --为了实现代码层解耦 村长博客:http://www.cnblogs.com/legu ...

  9. Django 信号

    信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到. 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生. 这在多处代码和同一事件 ...

随机推荐

  1. 开始在web中使用JS Modules

    本文由云+社区发表 作者: 原文:<Using JavaScript modules on the web> https://developers.google.com/web/funda ...

  2. asp.net core 系列之中间件基础篇(middleware)

    中间件是一种插入到管道上进行处理请求和响应的软件:每个中间件组件具有下面的功能: 选择是否把请求传递到管道上的下一个组件 可以在下一个组件的之前和之后做处理工作 请求委托(request delega ...

  3. 简述Java变量和强制转换类型

    简述Java变量和强制转换类型 java变量 1. java变量 变量:顾名思义,就是在java执行程序过程中可以发生改变的量,就好比方程式中的未知数X一样. 变量的内存分配过程 int a ; // ...

  4. css中的position(定位)

    一.position语法与结构 position语法: position : static absolute relative position参数:static : 无特殊定位,对象遵循HTML定位 ...

  5. 文本输入框input text输入字母自动转大写

    现在需要把一个input输入框内的字母自动转变为大写. 查了下资料,目前收集到的方法有两种: 使用JavaScript,在input标签添加onkeyup方法,将字符转为大写. <input n ...

  6. CSS消除button标签的默认样式

    button{ /*消除button的默认样式*/ /*这种写法是对所有的button标签同时生效*/ margin: 0px; padding: 0px; /*自定义边框*/ border: 0px ...

  7. 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?

    微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...

  8. Centos 7 django环境搭建

    1.本机网卡配置信息如下: vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER ...

  9. 如何在你的项目中集成 CAP【手把手视频教程】

    前言 之前录制过一期关于CAP的视频,但是由于当时是直播时录制的视频,背景音比较杂所以质量有点差.这次的视频没有直播,直接录制的,视频质量会好很多,第一遍录制完成之后发现播放到一半没有声音,所以又重新 ...

  10. PHP面向对象特性

    目录 创建对象 成员属性 成员方法 构造方法 析构方法 垃圾回收机制 访问修饰符 魔术方法 对象比较 继承 重载 属性重载 方法重写 属性重写 静态属性 静态方法 多态 类型约束 抽象类 接口 fin ...