信号

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

典型应用场景:在所有数据库相关操作(读/写) 前后都各记录一条日志

1、Django内置信号

  1. Model signals
  2. pre_init # django的modal执行其构造方法前,自动触发
  3. post_init # django的modal执行其构造方法后,自动触发
  4. pre_save # django的modal对象保存前,自动触发
  5. post_save # django的modal对象保存后,自动触发
  6. pre_delete # django的modal对象删除前,自动触发
  7. post_delete # django的modal对象删除后,自动触发
  8. m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
  9. class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
  10. Management signals
  11. pre_migrate # 执行migrate命令前,自动触发
  12. post_migrate # 执行migrate命令后,自动触发
  13. Request/response signals #【在中间件前就执行】
  14. request_started # 请求到来前,自动触发
  15. request_finished # 请求结束后,自动触发
  16. got_request_exception # 请求异常后,自动触发
  17. Test signals
  18. setting_changed # 使用test测试修改配置文件时,自动触发
  19. template_rendered # 使用test测试渲染模板时,自动触发
  20. Database Wrappers
  21. connection_created # 创建数据库连接时,自动触发

对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

  1. from django.core.signals import request_finished
  2. from django.core.signals import request_started
  3. from django.core.signals import got_request_exception
  4.  
  5. from django.db.models.signals import class_prepared
  6. from django.db.models.signals import pre_init, post_init
  7. from django.db.models.signals import pre_save, post_save
  8. from django.db.models.signals import pre_delete, post_delete
  9. from django.db.models.signals import m2m_changed
  10. from django.db.models.signals import pre_migrate, post_migrate
  11.  
  12. from django.test.signals import setting_changed
  13. from django.test.signals import template_rendered
  14.  
  15. from django.db.backends.signals import connection_created
  16.  
  17. def callback(sender, **kwargs):
  18. print("xxoo_callback")
  19. print(sender,kwargs)
    # sender代表 触发者,
    # **kwargs 代表触发时传递的参数
  20.  
  21. xxoo.connect(callback) # 向xxoo信号类型注册信号函数
  22. # xxoo指上述导入的内容
  1. from django.core.signals import request_finished
  2. from django.dispatch import receiver
  3.  
  4. @receiver(request_finished)
  5. def my_callback(sender, **kwargs):
  6. print("Request finished!")

2、自定义信号

a. 定义信号

  1. import django.dispatch
  2. pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
  1. toppingssize 代表触发信号要传递的参数
  1. pizza_done 为自定义信号名

b. 向信号中注册函数

  1. def callback(sender, **kwargs):
  2. print("callback")
  3. print(sender,kwargs)
  4.  
  5. pizza_done.connect(callback)

c. 触发信号

  1. from 路径 import pizza_done
  2.  
  3. pizza_done.send(sender='seven',toppings=123, size=456)

自定义信号案例

在manager.py 同级目录下创建 sg.py

sg.py

  1. import django.dispatch
  2.  
  3. # 定义信号
  4. pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
  5.  
  6. # 定义事件
  7. def callback(sender, **kwargs):
  8. print("callback")
  9. print(sender, kwargs)
  10.  
  11. # 向信号中注册函数
  12. pizza_done.connect(callback)

views.py 中手动触发信号

  1. def signal(request):
  2. from session_study import models
  3.  
  4. obj = models.UserInfo(user='root')
  5. print('end')
  6. obj.save()
  7.  
  8. # 手动触发信号
  9. from sg import pizza_done
  10.  
  11. pizza_done.send(sender='随便写表示发送信号的源', toppings='toppings', size='size')
  12.  
  13. return HttpResponse('ok')

自定义信号应用场景:

例如自己做一个监控,监控某个监控项到达一个阈值,触发一条告警。在告警动作中手动触发这个信号。以后只要是发告警就会自动触发自定义的信号。信号中到底做什么事儿。就自己随便注册了。例如发短信. 发微信. 发邮件等等 ...

django信号机制 (每个操作前后django都预留了两个钩子,便于统一化添加功能)的更多相关文章

  1. Django信号机制相关解释与示例

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

  2. 面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的,python AOP就是装饰器

    面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中myba ...

  3. 3分钟看懂Python后端必须知道的Django的信号机制!

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

  4. Django权限机制的实现

    Django权限机制的实现 1. Django权限机制概述 权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮.因此,基于Django的开发 ...

  5. Django models多表操作

    title: Django models多表操作 tags: Django --- 多表操作 单独创建第三张表的情况 推荐使用的是使用values/value_list,selet_related的方 ...

  6. Django的信号机制

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

  7. Python之路-(Django(csrf,中间件,缓存,信号,Model操作,Form操作))

    csrf 中间件 缓存 信号 Model操作 Form操作 csrf: 用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middlewa ...

  8. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  9. [py]flask操作cookie&django的seesion和cookie机制

    浏览器同源策略(same-origin policy) csrf攻击防御核心点总结 django的cookie和session操作-7天免登录 flask操作cookie&django的see ...

随机推荐

  1. linux结束进程命令

    在linux中,进程之间通过信号来通信.进程的信号就是预定义好一个消息,进程能识别它并决定忽略还是做出反应. 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL ...

  2. 查找 Search

    如果值域小一点. 那么我们有一个很精妙的做法. 分块完维护数字\(cnt\),和一个\(bitset\)信息. 然而小不得. 那么我们考虑维护后缀\(nxt_i\),表示第\(i\)位后,最近的\(a ...

  3. 洛谷 P6914 - [ICPC2015 WF]Tours(割边+找性质)

    洛谷题面传送门 神仙题. 深夜写题解感受真好 我们考虑两个简单环 \(C_1,C_2\)​​​,我们假设颜色种类数为 \(k\)​​​,那么我们需要有 \(C_1,C_2\)​​​ 均符合条件,而由于 ...

  4. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)

    题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...

  5. python18协程

    协程是我们自己调度的 进程是系统调度的协程切换很少开销 python3.5之前的实现方法 def yield_test(): """实现协程函数""& ...

  6. sig mesh 培训-18304

    1.mesh 的传输速率 ---有效数据最长的长度是10个字节 ---最小时间间隔是10ms,重传1次 --建议数据包之间不少于100ms 1S = 10*10 =100个字节 2.目前telink ...

  7. 【NetCore】RabbitMQ 封装

    RabbitMQ 封装 代码 https://gitee.com/wosperry/wosperry-rabbit-mqtest/tree/master 参考Abp事件总线的用法,对拷贝的Demo进行 ...

  8. C++类的定义,成员函数的定义,对象的创建与使用

    类是一个模板,可用类生成一系列可用的实例.例如 int B就是生成了一个符合int的数据B,类也是一样,使用类名就可以直接生成一个实例, 该实例中包含类中所有的数据类型和对这些数据的操作方法. 首先, ...

  9. LeetCode33题——搜索旋转排序数组

    1.题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 搜索一个给定的目标值,如果数组中存 ...

  10. OpenStack之九: 创建一个实例

    官网地址 https://docs.openstack.org/install-guide/launch-instance-networks-provider.html #:导入变量 [root@co ...