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之eval()函数危险性浅析
Jul 03 Python
简单介绍Python中的JSON模块
Apr 08 Python
python执行get提交的方法
Apr 29 Python
详解Python的Django框架中的通用视图
May 04 Python
python读取xlsx的方法
Dec 25 Python
python 2.7 检测一个网页是否能正常访问的方法
Dec 26 Python
python3实现微型的web服务器
Sep 03 Python
python实现淘宝购物系统
Oct 25 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Django如何使用redis作为缓存
May 21 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
关于文本留言本的分页代码
2006/10/09 PHP
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
解析php类的注册与自动加载
2013/07/05 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
javascript中"/"运算符常见错误
2010/10/13 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
JS中promise化微信小程序api
2018/04/12 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
英国领先的品牌珠宝和配件供应商:Acotis Jewellery
2018/03/07 全球购物
新学期决心书
2014/03/11 职场文书
分公司任命书
2014/06/06 职场文书
机电一体化专业毕业生自荐信
2014/06/19 职场文书
环保主题班会教案
2015/08/13 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang
MySQL8.0.18配置多主一从
2021/06/21 MySQL