序言

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. 还在用Synchronized?Atomic你了解不?

    前言 只有光头才能变强 之前已经写过多线程相关的文章了,有兴趣的同学可以去了解一下: https://github.com/ZhongFuCheng3y/3y/blob/master/src/thre ...

  2. Asp.Net Core 轻松学-多线程之取消令牌

    前言     取消令牌(CancellationToken) 是 .Net Core 中的一项重要功能,正确并合理的使用 CancellationToken 可以让业务达到简化代码.提升服务性能的效果 ...

  3. SQL注入渗透实战

    概述: 判断注入点: http://www.xxxxx.com/page.php?pid=42 and 1=1 #true http://www.xxxxx.com/page.php?pid=42 a ...

  4. [ArcGIS API for JavaScript 4.8] Sample Code-Get Started-popups简介

    [官方文档:https://developers.arcgis.com/javascript/latest/sample-code/intro-popup/index.html] 一.Intro to ...

  5. arcgis画矢量图

    总图 首先建立目标文件夹和目标文件(shp文件) 现在H:\ex_gis\下新建test文件夹,起名为test,再此目录下建立一个线要素文件. 在这里选择要素类型.这里以线为例,点面类推即可. 设置坐 ...

  6. 同事搭一个测试RAC说节点2发现idle了,报ORA-00304

    [oracle@testrac2 11204]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Jan 16 1 ...

  7. Windows无人值守文件unattend制作以及自定义系统安装

    原文链接:Create media for automated unattended install of Windows 10 我从来没看到过像上面的文章一样这么详细的描述过Windows10的无人 ...

  8. 【原】无脑操作:Windows下搭建Kafka运行环境

    Kafka是一种高吞吐量的分布式发布订阅消息系统 1.优点:① 通过磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能.② 高吞吐量:即使是非常普通的硬件Kaf ...

  9. 再谈AbstractQueuedSynchronizer2:共享模式与基于Condition的等待/通知机制实现

    共享模式acquire实现流程 上文我们讲解了AbstractQueuedSynchronizer独占模式的acquire实现流程,本文趁热打铁继续看一下AbstractQueuedSynchroni ...

  10. 最短路问题之Bellman-ford算法

    题目: 最短路:给定两个顶点,在以这两个点为起点和终点的路径中,边的权值和最小的路径.考虑权值为点之间的距离. 单源最短路问题,Bellman-ford算法 思路:每次循环检查所有边,可优化. 应用于 ...