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中的struct模块
Apr 28 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
详解django.contirb.auth-认证
Jul 16 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
Nov 30 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
Python3内置模块random随机方法小结
Jul 13 Python
详解在python操作数据库中游标的使用方法
Nov 12 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
python实现简单俄罗斯方块
Mar 13 Python
python实现逻辑回归的示例
Oct 09 Python
anaconda python3.8安装后降级
Jun 11 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
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
php DES加密算法实例分析
2019/09/18 PHP
解决Laravel5.5下的toArray问题
2019/10/15 PHP
javascript 面向对象 function类
2010/05/13 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
2013/04/01 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
[25:45]2018DOTA2亚洲邀请赛4.5SOLO赛 Sylar vs Paparazi
2018/04/06 DOTA
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python基础教程之Filter使用方法
2017/01/17 Python
python paramiko模块学习分享
2017/08/23 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
2019/02/22 Python
深入浅析Python中的迭代器
2019/06/04 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
关于多元线性回归分析——Python&SPSS
2020/02/24 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
python中if嵌套命令实例讲解
2021/02/25 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
几道PHP的面试题
2012/05/19 面试题
最新党员思想汇报
2014/01/01 职场文书
学校就业推荐信范文
2014/05/19 职场文书
应届大学生自荐书
2014/06/17 职场文书
公证委托书格式
2014/09/13 职场文书
《植树问题》教学反思
2016/03/03 职场文书
Golang数据类型和相互转换
2022/04/12 Golang