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实现问号表达式(?)的方法
Nov 27 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
用python实现对比两张图片的不同
Feb 05 Python
pandas中去除指定字符的实例
May 18 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python模块、包(Package)概念与用法分析
May 31 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
python 获取字典键值对的实现
Nov 12 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 Python
asyncio异步编程之Task对象详解
Mar 13 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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
浅析php-fpm静态和动态执行方式的比较
2016/11/09 PHP
JavaScript获取flash对象与网上的有所不同
2014/04/21 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
JavaScript中闭包之浅析解读(必看篇)
2016/08/25 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
2017/01/18 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
nodejs入门教程六:express模块用法示例
2017/04/24 NodeJs
深入理解Angular中的依赖注入
2017/06/26 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
jquery+ajax实现异步上传文件显示进度条
2020/08/17 jQuery
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
Python中的下划线详解
2015/06/24 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
python连接mysql有哪些方法
2020/06/24 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
泰国在线书店:SE-ED
2020/06/21 全球购物
软件工程师岗位职责
2013/11/16 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
法人代表授权委托书
2014/04/08 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
巾帼文明岗事迹材料
2014/12/24 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书