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和OpenCV库将URL转换为OpenCV格式的方法
Mar 27 Python
详解Python的Django框架中的中间件
Jul 24 Python
win10系统中安装scrapy-1.1
Jul 03 Python
windows下Python实现将pdf文件转化为png格式图片的方法
Jul 21 Python
Python实现的计数排序算法示例
Nov 29 Python
django启动uwsgi报错的解决方法
Apr 08 Python
python对list中的每个元素进行某种操作的方法
Jun 29 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
Oct 21 Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
python tkinter之顶层菜单、弹出菜单实例
Mar 04 Python
Python连接Impala实现步骤解析
Aug 04 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学习笔记(二):变量详解
2015/04/17 PHP
8个PHP数组面试题
2015/06/23 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
基于jquery实现最简单的选项卡切换效果
2016/05/08 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
Python中的filter()函数的用法
2015/04/27 Python
利用Django-environ如何区分不同环境
2018/08/26 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
python爬虫---requests库的用法详解
2020/09/28 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
测试工程师岗位职责
2013/11/28 职场文书
缴纳养老保险的证明
2014/01/10 职场文书
《恐龙》教学反思
2014/04/27 职场文书
建设工地安全标语
2014/06/07 职场文书
检察机关个人对照检查材料
2014/09/15 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
小学少先队工作总结2015
2015/05/26 职场文书
甲午风云观后感
2015/06/02 职场文书