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实现udp数据报传输的方法
Sep 26 Python
Python判断文件和文件夹是否存在的方法
May 21 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
Python内存管理实例分析
Jul 10 Python
Python2 与Python3的版本区别实例分析
Mar 30 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
python多进程使用函数封装实例
May 02 Python
python 如何停止一个死循环的线程
Nov 24 Python
python绘制高斯曲线
Feb 19 Python
Python基础之字符串格式化详解
Apr 21 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 Image Resize图片大小调整的函数代码
2011/01/17 PHP
解析php函数method_exists()与is_callable()的区别
2013/06/21 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
js改变html的原有内容实现方法
2016/10/05 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
js实现二级菜单点击显示当前内容效果
2018/04/28 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
javascript实现动态时钟的启动和停止
2020/07/29 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
3行Python代码实现图像照片抠图和换底色的方法
2019/10/10 Python
使用placeholder属性设置input文本框的提示信息
2020/02/19 HTML / CSS
《水上飞机》教学反思
2014/04/10 职场文书
文明城市创建标语
2014/06/16 职场文书
投资入股合作协议书
2014/10/28 职场文书
2015年财务部工作总结
2015/04/10 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android
frg-100简单操作(设置)说明
2022/04/05 无线电