Django框架 信号调度原理解析


Posted in Python onSeptember 04, 2019

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

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内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数:

示例:

#在model表中添加/删除记录时执行响应的方法
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)

自定义信号

定义信号

import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

注册信号

def callback(sender, **kwargs):
  print("callback")
  print(sender,kwargs)
pizza_done.connect(callback) 

触发信号

from 路径 import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)

由于内置信号的触发者已经集成到Django中,所以其会自动调用,而对于自定义信号则需要开发者在任意位置触发。 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python工程师面试题 与Python Web相关
Jan 14 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
Mac中Python 3环境下安装scrapy的方法教程
Oct 26 Python
Python实现的从右到左字符串替换方法示例
Jul 06 Python
python按照多个条件排序的方法
Feb 08 Python
OpenCV 轮廓检测的实现方法
Jul 03 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
python批量读取文件名并写入txt文件中
Sep 05 Python
python如何将多个PDF进行合并
Aug 13 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
python类共享变量操作
Sep 03 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 #Python
Django Admin中增加导出CSV功能过程解析
Sep 04 #Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 #Python
通过Python编写一个简单登录功能过程解析
Sep 04 #Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 #Python
python3实现微型的web服务器
Sep 03 #Python
Python面向对象之Web静态服务器
Sep 03 #Python
You might like
php 面向对象的一个例子
2011/04/12 PHP
php生成curl命令行的方法
2015/12/14 PHP
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
javascript四舍五入函数代码分享(保留后几位)
2013/12/10 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
详解JavaScript树结构
2017/01/09 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
virtualenv实现多个版本Python共存
2017/08/21 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Python如何输出整数
2020/06/07 Python
python编程的核心知识点总结
2021/02/08 Python
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
职业教育毕业生求职信
2013/11/09 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
《乌塔》教学反思
2014/02/17 职场文书
百年校庆节目主持词
2014/03/27 职场文书
初中班主任评语大全
2014/04/24 职场文书
行政人事主管岗位职责
2015/04/11 职场文书