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中copy和deepcopy中的区别
Oct 23 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
Python格式化日期时间操作示例
Jun 28 Python
Django实战之用户认证(初始配置)
Jul 16 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
Jun 13 Python
Python3 执行Linux Bash命令的方法
Jul 12 Python
elasticsearch python 查询的两种方法
Aug 04 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
QT5 Designer 打不开的问题及解决方法
Aug 20 Python
python代码实现猜拳小游戏
Nov 30 Python
Python爬虫后获取重定向url的两种方法
Jan 19 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合并discuz用户脚本的方法
2015/08/04 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
jQuery 源码分析笔记(3) Deferred机制
2011/06/19 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
JavaScript中Array的实用操作技巧分享
2016/09/11 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
JS中touchstart事件与click事件冲突的解决方法
2018/03/12 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
整理Python最基本的操作字典的方法
2015/04/24 Python
python实现微信发送邮件关闭电脑功能
2018/02/22 Python
python pyecharts 实现一个文件绘制多张图
2020/05/13 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
信息技术专业大学生个人的自我评价
2013/10/05 职场文书
高中体育教学反思
2014/01/29 职场文书
入股协议书
2014/04/14 职场文书
初中教师业务学习材料
2014/05/12 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
单位婚育证明范本
2014/11/21 职场文书
会计专业自荐信范文
2015/03/05 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
2015重阳节座谈会主持词
2015/07/30 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技