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 代码优化详解
Oct 27 Python
python字典键值对的添加和遍历方法
Sep 11 Python
深入浅出分析Python装饰器用法
Jul 28 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
python使用参数对嵌套字典进行取值的方法
Apr 26 Python
Django实现基于类的分页功能
Oct 31 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
python多进程下的生产者和消费者模型
May 07 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 Python
解析python中的jsonpath 提取器
Jan 18 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/10/09 PHP
数字转英文
2006/12/06 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
基于jQuery的倒计时实现代码
2012/05/30 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
详解javascript高级定时器
2015/12/31 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
less简单入门(CSS 预处理语言)
2017/03/08 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
p5.js入门教程之键盘交互
2018/03/19 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
python不带重复的全排列代码
2013/08/13 Python
Python标准库之循环器(itertools)介绍
2014/11/25 Python
python中threading超线程用法实例分析
2015/05/16 Python
python删除特定文件的方法
2015/07/30 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python File readlines() 使用方法
2018/03/19 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
python修改txt文件中的某一项方法
2018/12/29 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
详解python程序中的多任务
2020/09/16 Python
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
2014年庆元旦活动方案
2014/02/15 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
毕业生党员个人总结
2015/02/14 职场文书
学年个人总结范文
2015/03/05 职场文书
中秋节祝酒词
2015/08/12 职场文书
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS