django 信号调度机制详解


Posted in Python onJuly 19, 2019

前言

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

1、Django内置信号

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

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

from django.core.signals import request_finished
  from django.core.signals import request_started
  from django.core.signals import got_request_exception

  from django.db.models.signals import class_prepared
  from django.db.models.signals import pre_init, post_init
  from django.db.models.signals import pre_save, post_save
  from django.db.models.signals import pre_delete, post_delete
  from django.db.models.signals import m2m_changed
  from django.db.models.signals import pre_migrate, post_migrate

  from django.test.signals import setting_changed
  from django.test.signals import template_rendered

  from django.db.backends.signals import connection_created


  def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender,kwargs)

  xxoo.connect(callback)
  # xxoo指上述导入的内容
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

2、自定义信号

a. 定义信号

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

b. 注册信号

def callback(sender, **kwargs):
  print("callback")
  print(sender,kwargs)
 
pizza_done.connect(callback)

c. 触发信号

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

由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。

需求:

在表中每增加一条数据的时候,记录一条日志

django 信号调度机制详解

django_signals/__init__.py

from django.db.models import signals

def before_save1(*args,**kwargs):
  print('有车来了,我要服务了--》',args,kwargs)

def before_save2(*args,**kwargs):
  print('有车来了,我要服务了--》',args,kwargs)

def after_save1(*args,**kwargs):
  print('有车来了,完事了--》',args,kwargs)

# 增加之前
signals.pre_save.connect(before_save1)
signals.pre_save.connect(before_save2)
# 增加之后
signals.post_save.connect(after_save1)

django_signals/__init__.py

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python定时器使用示例分享
Feb 16 Python
wxPython窗口中文乱码解决方法
Oct 11 Python
python和shell实现的校验IP地址合法性脚本分享
Oct 23 Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
树莓派用python中的OpenCV输出USB摄像头画面
Jun 22 Python
python zip()函数使用方法解析
Oct 31 Python
Python matplotlib以日期为x轴作图代码实例
Nov 22 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
python傅里叶变换FFT绘制频谱图
Jul 19 #Python
Django forms表单 select下拉框的传值实例
Jul 19 #Python
Django组件content-type使用方法详解
Jul 19 #Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 #Python
django admin组件使用方法详解
Jul 19 #Python
使用python分析统计自己微信朋友的信息
Jul 19 #Python
django url到views参数传递的实例
Jul 19 #Python
You might like
php结合飞信 免费天气预报短信
2009/05/07 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
5款JavaScript代码压缩工具推荐
2014/07/07 Javascript
浅谈javascript中call()、apply()、bind()的用法
2015/04/20 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
[01:33]PWL开团时刻DAY2-开雾与反开雾
2020/10/31 DOTA
Python零基础入门学习之输入与输出
2019/04/03 Python
numpy.random.shuffle打乱顺序函数的实现
2019/09/10 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
使用CSS3在触屏上为按钮实现激活效果
2013/09/27 HTML / CSS
html5 Canvas画图教程(8)—canvas里画曲线之bezierCurveTo方法
2013/01/09 HTML / CSS
社区健康教育实施方案
2014/03/18 职场文书
安全生产责任书范本
2014/04/15 职场文书
高中生班主任评语
2014/04/25 职场文书
运动会口号大全
2014/06/07 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
如何理解及使用Python闭包
2021/06/01 Python
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android