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 01 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
Python 获取中文字拼音首个字母的方法
Nov 28 Python
Python3实现对列表按元组指定列进行排序的方法分析
Dec 22 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python 分发包中添加额外文件的方法
Aug 16 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python函数map()和partial()的知识点总结
May 26 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
Jul 09 Python
Python Map 函数的使用
Aug 28 Python
用pip给python安装matplotlib库的详细教程
Feb 24 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 htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
2014/06/25 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
2013/07/10 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
轻松5句话解决JavaScript的作用域
2016/07/15 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
Vuejs 单文件组件实例详解
2018/02/09 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
Python中的一些陷阱与技巧小结
2015/07/10 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
python中加背景音乐如何操作
2020/07/19 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
大学生个人简历中的自我评价
2013/12/27 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
九年级历史教学反思
2016/02/19 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏