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 相关文章推荐
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python解析json文件相关知识学习
Mar 01 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python使用wxPython实现计算器
Jan 30 Python
python得到单词模式的示例
Oct 15 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
python查询文件夹下excel的sheet名代码实例
Apr 02 Python
python for和else语句趣谈
Jul 02 Python
浅谈对pytroch中torch.autograd.backward的思考
Dec 27 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
python使用yaml 管理selenium元素的示例
Dec 01 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的中问验证码
2006/11/25 PHP
PHP无限分类的类
2007/01/02 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
windows下python安装小白入门教程
2018/09/18 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python split() 函数拆分字符串将字符串转化为列的方法
2019/07/16 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
Python extract及contains方法代码实例
2020/09/11 Python
JSF如何进行表格处理及取值
2012/08/06 面试题
木工主管岗位职责
2013/12/08 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
财务科科长岗位职责
2014/03/10 职场文书
专职安全员岗位职责
2015/04/11 职场文书
文化大革命观后感
2015/06/17 职场文书
运动员加油词
2015/07/18 职场文书
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android