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 回调函数和回调方法的实现分析
Mar 23 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
快速了解Python中的装饰器
Jan 11 Python
Python中的 enum 模块源码详析
Jan 09 Python
elasticsearch python 查询的两种方法
Aug 04 Python
PyQt5通信机制 信号与槽详解
Aug 07 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
Python中的min及返回最小值索引的操作
May 10 Python
python turtle绘图命令及案例
Nov 23 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 set_time_limit()函数的使用详解
2013/06/05 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
JavaScript中的this实例分析
2011/04/28 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
jQuery实现本地预览上传图片功能
2016/01/08 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Javascript Dom元素获取和添加详解
2019/09/24 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
javascript实现智能手环时间显示
2020/09/18 Javascript
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python3中详解fabfile的编写
2018/06/24 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
物业保安主管岗位职责
2013/12/25 职场文书
珍惜水资源建议书
2014/03/12 职场文书
中班上学期幼儿评语
2014/04/30 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
员工家属慰问信
2015/03/24 职场文书
开业典礼致辞
2015/07/29 职场文书
MySQL索引失效场景及解决方案
2022/07/23 MySQL