django信号
什么是信号?
信号是在某个操作前或后自动触发一些操作. 信号是通知,是一种状态,相当于在某种状态下发特定的消息
--为了实现代码层解耦
村长博客:http://www.cnblogs.com/leguan1314/articles/6555581.html
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 ↓↓
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 # 创建数据库连接时,自动触发
示例:
实现创建记录成功后print创建成功 -- 用post_save内置信号,django的modal对象保存后,自动触发post_save
首先注册信号: 固定写法
代码逻辑:
执行结果:
其他应用场景:
用户注册成功后发送邮件/ 订单支付成功后给管理员发消息/ 文章从未发布变成发布就让文章置顶
自定义信号:
step1创建信号 所有的信号都是 `django.dispatch.Signal` 的实例、那么在项目某个app下创建 名为 `custom_signals.py` 的文件,如下这么写:
# filename: custom_singals.py import django.dispatch # 声明了一个 `pizza_done` 信号,它将为接收者提供 `toppings`, `size` 参数 # 可以在任何时候更改这个参数列表 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])
step2 配置信号回调函数 在项目某个app下创建 名为 `register.py` 的文件,如下这么写:
# filename: register.py # 注册信号使用 from app01.custom_singals import pizza_done def pizza_done_func(sender, **kwargs): print("msg:", sender, kwargs) pizza_done.connect(pizza_done_func)
step3 注册信号 项目启动的时候要将这些信号注册,那么在对应 `app` 的 `apps.py` 文件中如下
# filename: app_name/apps.py from django.apps import AppConfig # `django` 工具包中封装好的动态导入模块的方法 from django.utils.module_loading import import_module class App01Config(AppConfig): name = 'app01' def ready(self): # 项目启动所有 `app` 的 `ready` 方法下的代码均会执行 import_module("app01.register") # 注册信号
step4: 发送信号 事先定义 一组 `url` 映射关系,在视图业务操作中发送我们的信号( 有俩种发送信号的方法 )
from django.shortcuts import HttpResponse from app01.custom_singals import pizza_done class PizzaStore: def send_pizza(self, toppings, size): # 发送信号 pizza_done.send(sender=self.__class__, toppings=toppings, size=size) # "OR" 上下俩个方法是等价的, 区别 ~ ~ pizza_done.send_robust(sender=self.__class__, toppings=toppings, size=size) def index(request, ): # 业务操作, 执行信号发送操作 PizzaStore().send_pizza(") return HttpResponse("ok")
django信号的更多相关文章
- Django 信号signal
序言 Django自带一套信号机制来帮助我们在框架的不同应用位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将信号(signals)发送给一组接收者(r ...
- 信号(Django信号、Flask信号、Scrapy信号)
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- Django信号机制相关解释与示例
Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...
- Django 信号使用问题
Django 信号使用问题: 在使用django内置信号修改新注册的用户密码的时候,发现内置信号没有被触发.百度&官方文档找到了答案 1.信号的函数应该放在哪里? 这段代码应该放在哪里? 严格 ...
- flask,scrapy,django信号
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- pythonのdjango 信号
一.内置信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. Model signals pre_init # d ...
- django信号浅谈
Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1.Django内置信号 Model signals pre_in ...
- Django 信号
信号 Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到. 简单来说,信号允许特定的sender通知一组receiver某些操作已经发生. 这在多处代码和同一事件 ...
- Django 信号、中间件、i18n 专题
信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 1. Django内置信号 Model signals pr ...
随机推荐
- MySQL 主从复制实战解析
前言:前面几篇文章讲解了在应用层读写分离的配置和使用,这篇文章将来个主从复制的实战解析. 说明:主从复制,读写分离结构图 原理图 主库生成一个线程: Binlog Dump线程 1.此线程运行在主库, ...
- python集合的分类与操作
如图: 集合的炒作分类: 确定大小 测试项的成员关系 遍历集合 获取一个字符串表示 测试相等性 连接两个集合 转换为另一种类型的集合 插入一项 删除一项 替换一项 访问或获取一项
- Mongodb分片集群技术+用户验证
随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...
- 【转】TEA、XTEA、XXTEA加密解密算法(C语言实现)
ref : https://blog.csdn.net/gsls200808/article/details/48243019 在密码学中,微型加密算法(Tiny Encryption Algorit ...
- [Reinforcement Learning] Model-Free Prediction
上篇文章介绍了 Model-based 的通用方法--动态规划,本文内容介绍 Model-Free 情况下 Prediction 问题,即 "Estimate the value funct ...
- MySQL中使用group_concat()函数数据字符过长报错的问题解决方法
最近在办公软件项目,在开发权限指标遇到一个问题:我们系统的一些逻辑处理是用存储过程实现的,但是有一天客户反馈说权限指标分配报错,查了分配的权限数据牵扯到的数据权限基础资源,没有问题.权限指标分配的存储 ...
- tomcat去掉ContextPath
众所周知,项目打成war包直接放到webapps下启动tomcat后访问项目需要带上ContextPath,也就是war包的文件名,需要去除掉这玩意最简单的办法是将war包重命名为ROOT.war,为 ...
- CentOS下TensorFlow安装命令
安装扩展源:sudo yum -y install epel-release 安装python-pip模块:sudo yum install python-pip 直接把whl文件download下来 ...
- 找到多个与名为“Home”的控制器匹配的类型。解决方法
“/”应用程序中的服务器错误. 找到多个与名为“Home”的控制器匹配的类型.如果为此请求(“{controller}/{action}/{id}”)提供服务的路由没有指定命名空间以搜索与此请求相匹配 ...
- 添加一个非模态对话框在revit中
RequestHandler handler = new RequestHandler(); ExternalEvent exEvent = ExternalEvent.Create(handler) ...