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装饰器由浅入深
Dec 09 Python
详解K-means算法在Python中的实现
Dec 05 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
Python多进程池 multiprocessing Pool用法示例
Sep 07 Python
Python3内置模块random随机方法小结
Jul 13 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
python 19个值得学习的编程技巧
Aug 15 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 Python
python中time tzset()函数实例用法
Feb 18 Python
Python必备技巧之函数的使用详解
Apr 04 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 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
JavaScript中Math对象使用说明
2008/01/16 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
js数组去重的方法汇总
2015/07/29 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
微信小程序 实例应用(记账)详解
2016/09/28 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
简单的通用表达式求10乘阶示例
2014/03/03 Python
介绍Python中的文档测试模块
2015/04/28 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
2018/01/04 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
详解python3中zipfile模块用法
2018/06/18 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
现代绅士日常奢侈品:Todd Snyder
2019/12/13 全球购物
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
参观考察邀请函范文
2014/01/29 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
企业宣传标语
2014/06/09 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL