前言

在平时应用中我们经常遇到比如新增加一个用户就发送短信,新增加一条留言就给我们 发送邮箱 这种需求,一般来说都可以在视图函数中完成这些操作。但是如果有多个地方都需要类似的操作,比如用户在N个应用中都可以留言,如果在每个视图函数中都写一遍 发送邮箱 这种操作无疑是不明智的,好在 django 框架中内置了 signals(信号) 机制,可以辅助我们监听某些行为,比如 model 新增,或者请求前和请求后。

信号

官方的信号主要分为以下几种,具体介绍详见 Django信号。

  1. Model signals
  • pre_init
  • post_init
  • pre_save
  • post_save
  • pre_delete
  • post_delete
  • class_prepared
  1. Management signals
  • post_syncdb
  1. Request/response signals
  • request_started
  • request_finished
  • got_request_exception
  1. Test signals
  • template_rendered

举例

这里举一个例子,官方推荐在应用目录下新增一个 signals.py文件

  1. 新建并注册app,我这里app名字是 signalapp
  2. 在app下方新建signals.py文件
  3. 修改 app下面的 apps.py
# 原来
from django.apps import AppConfigclass SignalappConfig(AppConfig):name = 'signalapp'
# 现在
from django.apps import AppConfigclass SignalappConfig(AppConfig):name = 'signalapp'def ready(self):# signals are imported, so that they are defined and can be usedimport signalapp.signals
  1. 编写 signals.py
# signalapp/signals.py
from django.dispatch import receiver
from django.db.models.signals import post_save
from signalapp.models import Postdef send():print("发送邮件")@receiver(post_save, sender=Post, dispatch_uid='Post_post_save')
def send_email(instance, **kwargs):send()

然后重启服务,接下来在任意地方只要新建了 Post 实例并保存了,该函数都将在保存之后执行。与之相对应的是函数是 pre_save,显然,这是在保存前执行的。 receiver 装饰器有三个参数:

  1. 第一个是要监听的信号,我这里是 post_save
  2. 第二个是所要监听的模型,我这里是 Post 是文章模型,所以这个函数会在每次有文章保存(新建或者更新)的时候触发
  3. post_save 在某个Model保存之后调用, 对于每个唯一的dispatch_uid,接收器都只被信号调用一次

这个信号的功能就是每次新建或者更改文章的时候发送一个邮件(邮件函数没写。。)

补充

其他的可以参考文档,django 的文档写得确实很好,另外想说的就是 sender 不一定是模型,也可以是函数:

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']))

django Signals相关推荐

  1. 测试django_如何像专业人士一样测试Django Signals

    测试django by Haki Benita 通过Haki Benita 如何像专业人士一样测试Django Signals (How to test Django Signals like a p ...

  2. Django signals 信号总结

    故事背景 最近在做的项目中都遇到使用 django 信号量,故此总结信号相关的使用. 什么是信号 Django 中内置一个 信号调度器,它可以帮助应用程序在框架中的其他地方发生某些固定操作时能够得到通 ...

  3. Django信号Signals原理与示例(评论通知)

    一.什么是信号(Signals) 官方定义见参考资料[1].以下是个人理解:django signals是一种机制--当某个动作(action)发生时,信号(signal)允许发送器(senders) ...

  4. django:信号机制

    文章目录 一,django信号 (一)什么是信号 (二)信号的使用场景 1,信号的直接使用场景 2,使用信号的终极目的 3,使用原则 二,如何使用信号 (一)自定义与使用信号 1,创建信号.信号发送器 ...

  5. Feep! search:一款面向程序员的搜索引擎,收录信息超 2900 万页!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 想让检索代码不再「大海捞针」?就用「Feep! search」. 一款专门面向程序员的搜索引擎,2021年9月才开 ...

  6. stevedore简介

    声明: 本博客欢迎转发,但请保留原作者信息! 新浪微博:@孔令贤HW: 博客地址:http://blog.csdn.net/lynn_kong 内容系本人学习.研究和总结,如有雷同,实属荣幸! ste ...

  7. Django的信号Signals介绍及使用

    Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行.通俗来讲,就是一些动作发生的 ...

  8. django的信号signals详解

    介绍: Django 提供一个了"信号分发器"机制,允许解耦的应用在框架的其它地方发生操作时会被通知到. 通俗而讲Django信号的工作原理,就是当某个事件发生的时候,会发出一个信 ...

  9. Django模型信号——django.db.models.signals

    目录 一.监听信号 1.接收器函数¶ 2.连接接收器函数¶ 3.连接到特定发送器发送的信号¶ 4.防止重复信号¶ 二.定义和发送信号 1.定义信号¶ 2.发送信号¶ 三.断开信号¶ 本站相关文章: 1 ...

最新文章

  1. NIO详解(十一):线程间通信管道Pipe
  2. 特征图注意力_向往的GAT(图注意力模型)
  3. 程序员之常用软件安装过程记录
  4. yarn========================(类似于node)
  5. redux-observable笔记
  6. iar环境下c语言编程,c语言_源代码-iar环境配置.pdf
  7. 如何批量登陆远程主机和配置【转】
  8. C++ 从入门到入土(English Version)Section 8 : Recursion, Searching and Backtracking
  9. Caffe傻瓜系列(4):其它常用层及参数
  10. 【数学建模】CUMCM-2014B 创意平板折叠桌 解题思路整理
  11. iOS:iOS开发非常全的三方库、插件等等
  12. 保存 web.xml 卡
  13. 如何在 Python 绘图中正常显示中文?(视频教程)
  14. 联想计算机不识别硬盘分区,联想笔记本进PE不识别硬盘
  15. 2019-02-24 经济 金融 投资 理财相关书籍推荐
  16. 厚积薄发打卡Day26:狂神说Java之JUC并发编程<代码+笔记>(上)
  17. 【NuxtJs】阻止微信内置浏览器的字体缩放的解决方案(vue,h5)
  18. Android移动应用程序开发
  19. 如何读取PLC的寄存器地址和点表?
  20. 什么是同源策略?解决跨域的三种方法?

热门文章

  1. JAVA实现简易版【斗地主】小游戏
  2. Deque接口实现栈功能
  3. 盗号木马Trojan-PSW.Win32.OLGame.vdh
  4. 大厂技术实现 | 行业解决方案系列教程
  5. @Deprecated详解
  6. kafka集成后台代码整理(支持kafka集群)
  7. 视频分辨率与与带宽的对应关系
  8. 收银机打印数据截取_商米智能化收银机,教你轻松把店开起来
  9. Bootstrap前端开发框架
  10. 紫光云,做建筑产业的跃迁者