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之模拟鼠标键盘动作具体实现
Dec 30 Python
Python3通过Luhn算法快速验证信用卡卡号的方法
May 14 Python
Python使用matplotlib绘制动画的方法
May 20 Python
django定期执行任务(实例讲解)
Nov 03 Python
python利用有道翻译实现"语言翻译器"的功能实例
Nov 14 Python
对Python实现累加函数的方法详解
Jan 23 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
Apr 11 Python
python开发之anaconda以及win7下安装gensim的方法
Jul 05 Python
Python 3 判断2个字典相同
Aug 06 Python
python 代码实现k-means聚类分析的思路(不使用现成聚类库)
Jun 01 Python
python import 上级目录的导入
Nov 03 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
php中的三元运算符使用说明
2011/07/03 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
Yii统计不同类型邮箱数量的方法
2016/10/18 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
PHP正则验证字符串是否为数字的两种方法并附常用正则
2019/02/27 PHP
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
2013/02/02 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
当滚动条滚动到页面底部自动加载增加内容的js代码
2014/05/13 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
Javascript vue.js表格分页,ajax异步加载数据
2016/10/24 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
BootStrap Fileinput上传插件使用实例代码
2017/07/28 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
用Python写的图片蜘蛛人代码
2012/08/27 Python
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
初步认识Python中的列表与位运算符
2015/10/12 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
中英双版中文教师求职信
2013/10/27 职场文书
公司年会晚宴演讲稿
2014/01/06 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
2022/04/12 PostgreSQL