Django框架 信号调度原理解析


Posted in Python onSeptember 04, 2019

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

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内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

示例:

#在model表中添加/删除记录时执行响应的方法
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)

自定义信号

定义信号

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

注册信号

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

触发信号

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

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

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

Python 相关文章推荐
深入解析Python中函数的参数与作用域
Mar 20 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
numpy中矩阵合并的实例
Jun 15 Python
Python3.7 新特性之dataclass装饰器
May 27 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
python 字符串追加实例
Jul 20 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
Windows下Sqlmap环境安装教程详解
Aug 04 Python
python 实现Harris角点检测算法
Dec 11 Python
详解修改Anaconda中的Jupyter Notebook默认工作路径的三种方式
Jan 24 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 #Python
Django Admin中增加导出CSV功能过程解析
Sep 04 #Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 #Python
通过Python编写一个简单登录功能过程解析
Sep 04 #Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 #Python
python3实现微型的web服务器
Sep 03 #Python
Python面向对象之Web静态服务器
Sep 03 #Python
You might like
php mysql Errcode: 28 终极解决方法
2009/07/01 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
js和jquery中循环的退出和继续下一个循环
2014/09/03 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python open读写文件实现脚本
2008/09/06 Python
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
python Kmeans算法原理深入解析
2019/08/23 Python
python3 求约数的实例
2019/12/05 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
MySQL面试题
2014/01/12 面试题
什么是servlet
2012/05/08 面试题
建筑设计专业求职自我评价
2014/03/02 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
2014年评职称工作总结
2014/11/20 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
2015年党性分析材料
2014/12/19 职场文书
党员自我评价2015
2015/03/03 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL