Django中信号signals的简单使用方法
作者:如何好听 发布时间:2023-08-18 08:49:49
正文
在平时的开发过程中,我们会遇到一些特殊的应用场景,如果你想要在执行某种操作之前或者之后你能够得到通知,并对其进行一些你想要的操作时,你就可以用Django中的信号(signals)。Django 提供一个“信号分发器”,允许解耦的应用在框架的其它地方发生操作时会被通知到,也就是说在特定事件发生时,可以发送一个信号去通知所有注册了这个信号的回调,在回调里进行想要的操作处理。
一.Django内置信号
Django内置了对数据表,migrate命令,url请求相关(request/response),使用test测试,连接数据库五大类信号。
Model signals
pre_init # model执行构造方法前,触发
post_init # model执行构造方法后,触发
pre_save # model执行save对象保存前,触发
post_save # model执行save对象保存前,触发
pre_delete # model执行delete对象删除前,触发
post_delete # model执行delete对象删除前,触发
m2m_changed # model使用多对多字段操作第三张表前后,触发
class_prepared # 程序启动时,检测已注册的model类,对每个类,触发
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 # 创建数据库连接时,触发
1.常用内置信号参数介绍
(1)django.db.models.signals.pre_save
pre_save处理程序的参数介绍
参数名 参数介绍
sender 模型类
instance 保存的实际实例(保存后的model数据对象)
raw 布尔值; True如果模型完全按照提供的方式保存。不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态
using 正在使用的数据库别名
update_fields 要传递给更新的字段集model.save(),或者None 如果update_fields未传递给它save()
(2)django.db.models.signals.post_save
post_save处理程序的参数介绍
参数名 参数介绍
sender 模型类
instance 保存的实际实例
created 布尔值; True如果创建了新记录(True表示数据创建)
raw 布尔值; True如果模型完全按照提供的方式保存。不应该查询/修改数据库中的其他记录,因为数据库可能尚未处于一致状态
using 正在使用的数据库别名
update_fields 要传递给更新的字段集model.save(),或者None 如果update_fields未传递给它save()
(3)django.db.models.signals.pre_delete
pre_delete处理程序的参数介绍
参数名 参数介绍
sender 模型类
instance 要删除的实际实例
using 正在使用的数据库别名
(4)django.db.models.signals.post_delete
post_delete处理程序的参数介绍
参数名 参数介绍
sender 模型类
instance 要删除的实际实例(该对象将不再存在于数据库中,因此请谨慎对待此实例)
using 正在使用的数据库别名
更多信号参数介绍请参考https://docs.djangoproject.com/zh-hans/2.1/ref/signals/
2.内置信号监听方法
对于Django内置的信号,仅需注册指定信号,当程序执行相应操作时,自动触发注册函数。当你写好一个 * (receiver function)用于接收到信号以后的回调处理后,就需要将 * 连接到信号,有两种方法,手动连接,跟使用receiver装饰器的方式。
手动连接实现方法:
from django.db.models.signals import post_delete
def my_callback(sender, **kwargs):
print(sender)
print("信号已接收")
post_delete.connect(my_callback) # 信号连接 * ,用于收到信号的回调,如果想要指定某个表对象,直接指定sender
# connect参数接收
"""
receiver - 将连接到此信号的回调函数。回调函数名,不带括号
sender - 指定从中接收信号的特定发送方。
weak - Django默认将信号处理程序存储为弱引用。因此,如果您的 * 是本地功能,它可能被垃圾收集。为了防止这种情况,请weak=False在调用信号connect()方法时通过。
dispatch_uid - 在可能发送重复信号的情况下信号 * 的唯一标识符。
"""
receiver装饰器实现方法:
from django.dispatch import receiver
from django.db.models.signals import post_delete
from app.models import UCenter
@receiver(post_delete, sender=UCenter) # post_delete指定信号触发类型,sender指定到具体对象
def delete_u2user(sender, instance, **kwargs): # instance表示被删除的对象
print(sender, instance)
更多信号操作相关问题参考文档https://docs.djangoproject.com/zh-hans/2.1/topics/signals/
二.自定义信号使用
1.定义信号
from django.dispatch import Signal
test_signal = Signal(providing_args=["name", "age"]) # 声明一个test_signal的信号,提供给 * name跟age两个参数(可自定义参数)
2.注册信号
def my_callback(sender, **kwargs):
print(sender)
print("信号已接收")
test_signal.connect(my_callback) # 注册信号,指定 * 为my_callback
3.触发信号
from xxx import test_signal
test_signal.send(sender='test', name='zzq', age='18') # 触发信号,发送name,age参数信息
当然这样在选择发送信号的方式有两种一种使用Signal.send,还有一种是Signal.send_robut。
send()与send_robust()处理 * 功能引起的异常的方式不同。
send()并不能捕获由 * 提出的任何异常; 它只是允许错误传播。因此,在面对错误时,不是所有 * 都可以被通知信号。
send_robust()捕获从Python Exception类派生的所有错误,并确保所有 * 都收到信号通知。如果发生错误,则会在引发错误的 * 的元组对中返回错误实例。
来源:https://www.cnblogs.com/zzqit/p/11120756.html


猜你喜欢
- 雪花算法是在一个项目体系中生成全局唯一ID标识的一种方式,偶然间看到了Python使用雪花算法不尽感叹真的是太便捷了。它生成的唯一ID的规则
- 目录前言创建组件总结前言Vue3 增加了很多让人眼前一亮的特征,suspense 组件就是其中之一,对处理异步请求数据非常实用,本文通过简单
- 二、基本概念1、数据库数据库(DB):即DataBase的缩写,是按照一定的数据结构来组织、存储和管理数据的一个仓库。是存储在一起的相关数据
- 什么是随机数随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。伪随机和真随机计算机在程序上工作,程序是权威的指令集。因此
- 本文为大家分享了macOS下mysql 8.0.16 安装配置教程,供大家参考,具体内容如下1、安装程序下载打开MySQL 官网选择 DOW
- 需求:从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想
- 我们使用编辑器的时候,想要在其中添加一个Django项目,这样就能在里面做一些想要的操作。有些人还没有对Django进行安装,这里直接用命令
- 装饰器的价值不言而喻,可以用来增强函数功能、简化代码、减少代码冗余。它的使用场景同样很多,比较简单的场景包含打印日志、统计运行时间,这类例子
- 大家好~ 老Amy来啦!已经n久没有给大家输出关于办公自动化的文章了…为什么呢?罗列原因:太忙!(被领导“压榨”)太忙!(没有额外的精力揣测
- 数据库连接池对一个简单的数据库应用,由于对数据库的访问不是很频繁,这时可以简单地在需要访问数据库时,就新创建一个连接,就完后就关闭它,这样做
- pip install *** :Cannot connect to proxy在使用pip install 安装任何新的包都会出现下面错误
- 解决安装Office2003 SP2后不能打开Access的问题手动更改注册表要解决此问题, 手动更改计算机上注册表位置启动 Access
- 时间紧任务重,女神提出的要求有模棱两可,只能自己考虑各种情况,除了用python还有谁能这么短的时间搞出来。程序界面,增删改查不能少,后悔药
- 前言:如今,大多数计算机都带有多个内核,允许多个线程并行运行计算。即使处理器只有单核,也可以通过并发编程来提升程序的运行效率,比如在一个线程
- 支持向量机可以用来拟合线性回归。 相同的最大间隔(maximum margin)的概念应用到线性回归拟合。代替最大化分割两类目标是,最大化分
- 随着现在宽屏显示器的流行,Flash的全屏模式下,越来越需要考虑到普屏显示器与宽屏显示器的差别。Flash全屏模式有以下特点:窗口最大化,且
- 索引 经常要查询的语句,则给它建一个索引 表连接 select T_Oders as o join T_Customers as C on
- 首先,来说一下对话框: 对话框在Windows应用程序中使用非常普遍,许多应用程序的设定,与用户交互需要通过对话框来进行,因此对话框是Win
- 本文实例分析了python开发之list操作。分享给大家供大家参考,具体如下:对python中list的操作,大家可以参考《Python l
- HTML 的空白符处理规则HTML 中的“空白符”包括空格 (space)、制表符 (tab)、换行符 (CR/LF) 三种。我们知道,在默