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提取Linux内核源代码的目录结构实现方法
Jun 24 Python
Python实现mysql数据库更新表数据接口的功能
Nov 19 Python
python 动态生成变量名以及动态获取变量的变量名方法
Jan 20 Python
Python3直接爬取图片URL并保存示例
Dec 18 Python
Python生成词云的实现代码
Jan 14 Python
django haystack实现全文检索的示例代码
Jun 24 Python
Keras实现DenseNet结构操作
Jul 06 Python
python三引号如何输入
Jul 06 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
python如何对链表操作
Oct 10 Python
python和C++共享内存传输图像的示例
Oct 27 Python
python复合条件下的字典排序
Dec 18 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的控制语句
2006/10/09 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php实现的http请求封装示例
2016/11/08 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
JavaScript 性能优化小结
2015/10/12 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
2016/09/05 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
layui使用表格渲染获取行数据的例子
2019/09/13 Javascript
vue使用showdown并实现代码区域高亮的示例代码
2019/10/17 Javascript
编程语言Python的发展史
2014/09/26 Python
python类中super()和__init__()的区别
2016/10/18 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
python实现按行分割文件
2019/07/22 Python
django drf框架自带的路由及最简化的视图
2019/09/10 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
2020/03/31 Python
python logging模块的使用
2020/09/07 Python
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
幼师自我鉴定
2014/02/01 职场文书
2014年党务公开方案
2014/05/08 职场文书
公司股份合作协议书
2014/12/07 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android