django 信号调度机制详解


Posted in Python onJuly 19, 2019

前言

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

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

from django.core.signals import request_finished
  from django.core.signals import request_started
  from django.core.signals import got_request_exception

  from django.db.models.signals import class_prepared
  from django.db.models.signals import pre_init, post_init
  from django.db.models.signals import pre_save, post_save
  from django.db.models.signals import pre_delete, post_delete
  from django.db.models.signals import m2m_changed
  from django.db.models.signals import pre_migrate, post_migrate

  from django.test.signals import setting_changed
  from django.test.signals import template_rendered

  from django.db.backends.signals import connection_created


  def callback(sender, **kwargs):
    print("xxoo_callback")
    print(sender,kwargs)

  xxoo.connect(callback)
  # xxoo指上述导入的内容
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

2、自定义信号

a. 定义信号

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

b. 注册信号

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

c. 触发信号

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

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

需求:

在表中每增加一条数据的时候,记录一条日志

django 信号调度机制详解

django_signals/__init__.py

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)

django_signals/__init__.py

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

Python 相关文章推荐
python实现倒计时的示例
Feb 14 Python
Python发送form-data请求及拼接form-data内容的方法
Mar 05 Python
使用Python绘制图表大全总结
Feb 11 Python
Python中动态创建类实例的方法
Mar 24 Python
python实现xlsx文件分析详解
Jan 02 Python
python读取文本中数据并转化为DataFrame的实例
Apr 10 Python
Pycharm 实现下一个文件引用另外一个文件的方法
Jan 17 Python
python使用minimax算法实现五子棋
Jul 29 Python
利用python实现汉字转拼音的2种方法
Aug 12 Python
python文件和文件夹复制函数
Feb 07 Python
Django展示可视化图表的多种方式
Apr 08 Python
深入浅析Django MTV模式
Sep 04 Python
python傅里叶变换FFT绘制频谱图
Jul 19 #Python
Django forms表单 select下拉框的传值实例
Jul 19 #Python
Django组件content-type使用方法详解
Jul 19 #Python
django多个APP的urls设置方法(views重复问题解决)
Jul 19 #Python
django admin组件使用方法详解
Jul 19 #Python
使用python分析统计自己微信朋友的信息
Jul 19 #Python
django url到views参数传递的实例
Jul 19 #Python
You might like
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
2014/05/05 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
JavaScript Cookie的读取和写入函数
2009/12/08 Javascript
JavaScript初学者需要了解10个小技巧
2010/08/25 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
浅谈使用mpvue开发小程序需要注意和了解的知识点
2018/05/23 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
python统计文本文件内单词数量的方法
2015/05/30 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
Python处理PDF及生成多层PDF实例代码
2017/04/24 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
django template实现定义临时变量,自定义赋值、自增实例
2020/07/12 Python
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
澳大利亚购买最佳炊具品牌网站:Cookware Brands
2019/02/16 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
运动会获奖感言
2014/02/11 职场文书
海飞丝的广告词
2014/03/20 职场文书
家长通知书家长评语
2014/04/17 职场文书
模具专业自荐信
2014/05/29 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书