3分钟看懂Python后端必须知道的Django的信号机制
作者:画星星高手 发布时间:2022-08-17 18:17:55
概念
django自带一套信号机制来帮助我们在框架的不同位置之间传递信息。也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发送给一组接受者(receivers)。
(感觉就很像Qt的信号与槽机制)
信号系统包含以下三要素:
发送者-信号的发出方
信号-信号本身
接收者-信号的接受者
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 # 创建数据库连接时,自动触发
在ORM模型的save()方法调用之前或之后发送信号
django.db.models.signals.pre_save
django.db.models.signals.post_save
在ORM模型或查询集的delete()方法调用之前或之后发送信号。
django.db.models.signals.pre_delete
django.db.models.signals.post_delete
当多对多字段被修改时发送信号。
django.db.models.signals.m2m_changed
当接收和关闭HTTP请求时发送信号。
django.core.signals.request_started
django.core.signals.request_finished
这就很方便了,想象一下这样一个情景,我们引入了一个第三方的Django库,他会创建模型,我们想要在不修改他的代码的情况下,在他创建模型的时候同时修改其他表的数据,那么这时候信号机制就能派上用场了。
简单使用例子
信号监听有两种方式,一种是 Signal.connect() 方法,一种是装饰器。
Signal.connect()方法
方法原型:
Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)[source]
参数:
receiver :当前信号连接的回调函数,也就是处理信号的函数。
sender :指定从哪个发送方接收信号。
weak : 是否弱引用
dispatch_uid :信号 * 的唯一标识符,以防信号多次发送。
装饰器法
from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
print("Request finished!")
可以给 receiver 添加 sender 参数来筛选接收哪个模型产生的信号,比如:
from django.db.models import signals
from django.dispatch import receiver
@receiver(signals.post_save, sender=MyModel)
def demo_callback(sender: MyModel, instance: MyModel, **kwargs):
pass
注意要读取传入的模型对象一定是要用 instance 参数,不是 sender ! sender 是一个类型!
设置dispatch_uid参数防止重复信号
为了防止重复信号,可以设置dispatch_uid参数来标识你的 * ,标识符通常是一个字符串,如下所示:
from django.core.signals import request_finished
request_finished.connect(my_callback, dispatch_uid="my_unique_identifier")
断开信号
在满足某些条件下,我们不再需要监听信号,可以选择断开信号。
Signal.disconnect()用来断开信号的 * 。和Signal.connect()中的参数相同。如果 * 成功断开,返回True,否则返回False。
Signal.disconnect(receiver=None, sender=None, dispatch_uid=None)[source]
后记
最近刚入职项目很多特别的忙,也学到了很多新技术,但是感觉已经好久没有时间来好好写一篇博客了,就算是本文也是短时间拼凑的,真是难呀,周末得好好整理一下最近的技术笔记。
关于Django信号机制的更多内容(自定义信号等),可以参考官方文档。 https://docs.djangoproject.com/en/3.0/topics/signals/
来源:https://www.cnblogs.com/deali/p/13372922.html
猜你喜欢
- 代码都比较容易理解的,主要就是在以16进制读取图片信息那段代码有点乱,其实仔细看看,也没什么的。glabal.cssbody{}{ &nbs
- 目录1. 双向循环的练习2. break_pass_continue的使用3. for循环小提示:4. 小练习问题:答案:总结1. 双向循环
- selenium 介绍selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比
- 一、集合在 python 中用 {} 扩起一堆数字,但是这堆数字没有体现映射关系,那么这堆数字就是一个集合。集合的特色:集合在 python
- python配置文件有.conf,.ini,.txt等多种python集成的 标准库的 ConfigParser 模块提供一套 API 来读
- 个人认为python的paramiko模块是运维人员必学模块之一,其ssh登录功能是旅行居家必备工具。安装paramiko很简单,pip i
- python 容器总结整理list可变数组tuple不可变数组dict键值对(key-value)的字典(dictionary)初始化:a=
- 参数数量及其作用该函数共有两个参数,分别是key和scope。def get_collection(key, scope=None) Wra
- 最近发现数据库服务器压力很大,CPU经常达到100%。查看进程,发现有大量的sp_cursorclose;1进程信息。网上查了下,出现sp_
- FileUpload上传图片(图片不变形) 的实现方法,需要的朋友可以参考下。<style type="text/css&q
- php面试题的题目: $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php
- 一. 引言在数据分析和可视化领域,数据的有效呈现是至关重要的。Python作为一种强大的编程语言,提供了多种数据可视化工具和库。其中,Plo
- 一、pip异常有一小部分童鞋在打开cmd输入pip后出现下面情况:Did not provide a commandDid not prov
- 图片文字分割的时候,常用的方法有两种。一种是投影法,适用于排版工整,字间距行间距比较宽裕的图像;还有一种是用OpenCV的轮廓检测,适用于文
- 运行结果:程序代码如下:#将excel中的数据进行读取分析import openpyxlimport numpy as npimport m
- 一、python运算时精度问题1.运行时精度问题在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
- 利用GDAL库对tif影像进行读取 示例代码默认波段为[B、G、R、NIR的顺序,且为四个波段]import gdaldef readTif
- 一、配置webdriver下载谷歌浏览器驱动,并配置好import timeimport randomfrom PIL import Ima
- 本文汇总了在Access数据库安全问题中最为常见的问题来做出解答。问:什么是Microsoft Access 工作组,怎样创建工作组信息文件
- 前言大家好,我们今天来爬取c站的热搜榜,把其文章名称,链接和作者获取下来,我们保存到本地,我们通过测试,发现其实很简单,我们只要简单获取数据