django signal基础

Django学习笔记--WSGI介绍 文章目录前言WSGI 的理解 前言 Web服务器是连接用户浏览器与Python服务器端程序的中间节点,在网站建立的过程中起着重要作用。WSGI(Web Server Gateway Interface)是将Python服务器端程序连接到Web服务器的通用协议,大部分的Web框架都实现了此协议。它规定了Web服务器如何跟应用程序交互。 WSGI的接口分为两个:一个是与Web服务器的接口如:uwsgi等,另一个是与服务器端程序的接口。我们并不需要关注第二个接口。 WSGI 的理解 WSGI协议分为两部 阅读详情

Django Signals 从实践到源码分析

MAR 31, 2014 on django

当某个事件发生的时候,signal(信号)允许senders(发送者)用来通知receivers(接收者),通知receivers干嘛?你想要recivers干嘛就可以干嘛。这在多处代码对同一个事件感兴趣的时候就有用武之地了。 比如:Django提供了一个built-in signal,叫django.core.signals.request_finished,这个signal会在一个HTTP请求完成后发送。下面就用一个简单的实例说明:在每个请求完成后打印"request finished"

编写receiver

reciver是一个普通的callable对象,简单来说就是一个可被调用的函数,但是需要注意的是它需要接收一个参数sender和一个关键字参数**kwargs

def my_callback(sender, **kwargs):
    '''
    这是个receiver函数
    你可以在这里做爱做的的事情
    '''
    print sender
    print kwargs
    print("Request finished!")

这里我们先撇开sender和kwargs后面再分析,reciver函数写好之后,就需要把request_finished信号连接(注册)到my_callback。

from django.core.signals import request_finished
request_finished.connect(my_callback)

现在请求一个URL路径/hello,后台打印的结果:

[31/Mar/2014 21:52:33] "GET /hello/ HTTP/1.1" 200 263
<class 'django.core.handlers.wsgi.WSGIHandler'>
{'signal': <django.dispatch.dispatcher.Signal object at 0x0262E510>}
Request finished!

以上就是一个signal的执行流程,那么django内部是怎么实现的呢?为什么调用了reciver.connect后,my_callback就能得到执行了呢?且看源代码分析:

request_finished定义在文件django.core.signals.py里面:

from django.dispatch import Signal

request_started = Signal()
request_finished = Signal()
got_request_exception = Signal(providing_args=["request"])

request_finished就是Signal的实例。GET请求完成后会执行my_callback方法,为什么这么神奇,我们顺着request_finished的思路来猜想,既然是请求完成了,那么此时response对象也生成了,那么神奇的事情一定是在response里面发生的。去response.py文件里面看看:django.http.response.py

def close(self):
    for closable in self._closable_objects:
        try:
            closable.close()
        except Exception:
            pass
    signals.request_finished.send(sender=self._handler_class)

看到在response的close方法里面有send方法,而且这个sender就是我们在前面看到的django.core.handlers.wsgi.WSGIHandler',这个send方法会发送信号给所有的receivers。

#Signal.send方法的源代码:

responses = []
if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:
    return responses

for receiver in self._live_receivers(sender):
    response = receiver(signal=self, sender=sender, **named)
    responses.append((receiver, response))
return responses

注意:你可以看到在for循环里面迭代的调用的receiver方法。以上就是django内部的执行原理。思考下send方式是signal的而不是sender的呢?从面向对象的角度来说,谁是对象的拥有者,谁就提供相应的方法。比如汽车的drive方法肯定是由汽车提供而不是由人。

小结

我们需要做的只是编写receiver,然后调用signal.connect方法,相当于把receiver注册到signal上去。当事件触发时,相应的signal就会通知所有注册的receivers得到调用。尼玛,这是传说中的观察者模式。

连接receiver函数还有另外一个方法,用装饰器:

@receiver(request_finished):
def my_handler(sender, **kwages):
    '''

django还提供了很多内置的signals,比如:

  1. django.db.models.signals.pre_save & django.db.models.signals.post_save

    Sent before or after a model’s save() method is called.

  2. django.db.models.signals.pre_delete & django.db.models.signals.post_delete

    Sent before or after a model’s delete() method or queryset’s delete() method is called.

  3. django.db.models.signals.m2m_changed

    Sent when a ManyToManyField on a model is changed.

signal还可以指定具体的senders,比如pre_save这个signal是在Model对象保存在被发送,但是我希望只有某一类Model保存的时候才发送,你就可以指定:

@receiver(pre_save, MyModel):
def my_handle(sender, **kwargs):
    pass

这样每次只有保存MyModel实例后才会发送,其他的XXModel就会忽略掉。

完!

Django信号 Django包含一个“信号的分发器”,用于在框架执行操作时解耦。就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者 Django内置的信号     1.model中的内置信号 Model signals pre_init # django的model执行其构造方法前,自动触发 post_init ... 阅读详情

相关推荐

Django中信号signal针对model的使用

Django中实现对数据库操作的记录除了使用开源插件还可以使用信号signal独立实现 信号机制-观察者模式-发布与订阅:signal 配置 # 文件路径:Django/myapps/__init__.py default_app_config = 'myapps.apps.MyAppsConfig' # 文件路径:Django/myapps/apps.py from django.apps import AppConfig class MyAppsConfig(AppConfig): nam

Lei Gong's blog 594

Django Signals 从实践到源码分析

当某个事件发生的时候,signal(信号)允许senders(发送者)用来通知receivers(接收者),通知receivers干嘛?你想要recivers干嘛就可以干嘛。这在多处代码对同一个事件感兴趣的时候就有用武之地了。 比如:Django提供了一个built-in signal,叫django.core.signals.request_finished,这个signal会在一个HTTP请求

筑梦★逐梦 1091

Django--29用户权限设计

这样至少保证在django(auth)眼里,用户加入的组都是(在项目中)客观存在的。这样防止用户选择不该具有权限的项目,避免通过从其他项目的组获得权限操作不相干的项目。4、漏洞在不同项目中具有不同角色时,会在所有加入的项目中获得所持有的组的权限合集。确保项目成员设置的角色单向同步到auth的角色(因为要在auth层面跟权限结合)1、使得auth的用户和组关系,要随着项目成员和组关系的变化而变化(同步)这个问题在于要提供对象粒度的权限控制,而auth提供的是Model粒度的。...

摘 月 1260

Django在Views视图内取消当前请求的@receiver(post_save, sender=xxxxxx)信号

因为写过post_save信号当遇到post请求的话都会执行这个信号函数,如果想取消当前post请求不去执行这个信号可以按以下操作

主要发布一些日常学习代码及理解 734

niushop靶场漏洞查找-文件上传漏洞等(超详细)

发现报错,而且这个报错十分熟悉,与我们所学的sqli报错注入特别像。这里查询到后面的url有且仅有一个,目测估计是后台。上传的图片是包含一句话木马的图片。发现获取到了webshell。实战漏洞-niushop。

qq_59020256的博客 1729

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

Django内置信号(常用内置信号参数介绍、内置信号监听方法:手动连接实现方法和receiver装饰器实现方法)、自定义信号使用(定义信号、注册信号、触发信号)

Django内置信号(常用内置信号参数介绍、内置信号监听方法:手动连接实现方法和receiver装饰器实现方法)、自定义信号使用(定义信号、注册信号、触发信号)

linjun的博客 890

2026年4月AI爆发周:阿里连推三款模型、字节全双工语音上线,国内大模型进入“落地竞速“新阶段

**摘要:**2026年4月初,国内AI大模型迎来密集发布,阿里、字节、腾讯分别推出新产品。阿里一周发布三款模型,覆盖通用推理、多模态轻量化和长文档处理,API价格大幅下降;字节推出全双工语音模型,实现实时交互,技术难度高;腾讯混元3.0强调工程化和生态整合,面向企业私有化部署。趋势显示,行业从性能竞赛转向落地竞赛,多模态成为主战场,API成本降低,开发者选择更丰富。国内大模型竞争重点转向实际应用和生态整合。

weixin_45526015的博客 1万+

浅谈Django中的Signal

前言在web开发中, 你可能会遇到下面这种场景: 在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后, 你要发送一份确认邮件. 当然可以把逻辑写在一起,但是有个问题是,触发操作一般不止一种(如用户更改了其它信息的确认邮件),这时候这个逻辑会需要写多次,所以你可能会想着DRY(Don’t repeat yourself),于是你把它写到了一个函数中,每次调用。当然这是

Mr.Phoebe的专栏 3467

视觉SLAM与激光SLAM简单对比分析

本文旨在梳理目前较为前沿的SLAM技术,包括激光和视觉,主要从精度和实时性两个方面对算法进系评价。对于激光SLAM了解不深,后期需要补充相关算法的核心思想与算法框架。有问题请大佬们随时留言,我再改正。

超爱吃小蛋糕的66的博客 3854

手把手教你学simulink(11.6)--Simulink 航空航天场景:基于Simulink的飞机俯仰控制系统的数学模型

自动驾驶系统在航空航天领域具有重要应用,特别是在商业航空、军用航空和无人机等领域。PID控制器因其简单且有效的特性,被广泛应用于飞行控制。Simulink提供了一个强大的平台,用于建模、仿真和分析动态系统,非常适合设计和测试自动驾驶系统的控制器。通过本项目的实施,我们成功设计和仿真了一个用于控制飞机俯仰角的PID控制器。该项目展示了从系统建模、控制器设计、仿真验证到结果分析的完整流程,为PID控制器的设计提供了有价值的参考。希望这个实例能够为你的航空航天项目提供有用的指导。

MHD0815的博客 565

djangochannelsrestframework @observer 信号订阅:把 Django Signal 变成 WebSocket 实时通知

djangochannelsrestframework(简称 DCRF)是一个基于 Django Channels v4 的 WebSocket REST 框架,而 @observer 是它最具魅力的功能之一:只需几行代码,就能把 Django Signal 信号订阅变成实时推送的 WebSocket 通知。本文面向新手,用通俗的方式讲清 djangochannelsrestframework 信

gitblog_01089的博客 654

产品需求从场景,初始需求IR,产品需求 OR,设计需求DR,设计规格DS的具体案例说明,以扫地机产品为例

摘要: 以扫地机器人"宠物粪便避障"功能为例,说明从用户场景到产品落地的完整需求转化路径。初始需求(IR)源于养宠家庭痛点,要求100%避障并自动告警;产品需求(OR)转化为≥98%识别准确率等量化指标;设计需求(DR)拆解为感知、决策、执行三大技术模块;最终形成传感器选型(如索尼IMX678)、芯片规格(高通QCS6490)等设计规格(DS)。通过实验室模拟和用户测试验证,该功能使产品溢价30%,养宠家庭购买占比达52%,实现技术与商业价值的统一。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 769

Django Signal简析——从Observer Pattern到Django Signal

Django Signal 简析观察者模式Signal简述1. signal2. sender3. receiver原理简析1. Signal的属性和\__init__方法2. Signal中的方法3. 大概流程4. 很奇怪的一点5. 多说一句源码简析一些可能有用的链接 其实原本准备起名儿叫"Django Signal源码解析 ——从观察者模式到Django Signal"的,但是这样写实在太多了哈哈哈哈哈哈,写了一半实在写不动了就放弃了,重写了这篇 观察者模式 “观察者模式是一种对象行为模式。它定义对

heaciy的博客 413

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 555

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Django—信号 signal_django signal例子

除了Django为我们提供的内置信号(比如前面列举的那些),很多时候,我们需要自己定义信号。所有的信号都是的实例。print(“我已经做完了工作。现在我发送一个信号出去,给那些指定的接收器。”)自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

2401_84247341的博客 1247

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Django—信号 signal_django signal例子,精心整理

除了Django为我们提供的内置信号(比如前面列举的那些),很多时候,我们需要自己定义信号。所有的信号都是的实例。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84263262的博客 1095

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Django-signal组件

定义信号# 自定义信号注册回调触发信号cut_info_signal.send("触发了此信号")将某些动作都注册在一个信号中,一旦达到条件则触发信号(所有回调都执行)。信号的定义和注册我们一般不放在视图函数中,转而放在项目根目录的文件中(只要项目启动,该文件会自动加载)

m0_72839702的博客 1500

Django Signal 解析

Siganl 是 Django 框架中提供的一个 “信号分发器”,其实就是设计模式中经常提到的 观察者模式的一个实现应用。Django 中Siganl 机制的典型应用是,框架为 Models 创建了 pre_save post_save等 与模型的某些方法调用相关联的信号,如 pre_save 和 post_save 分别 会在 Modle 的 save()方法的调用之前和之后 通知观察者。Sig

Knight-ZXW的博客 4658

django之signal

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。 1.django内置信号 Model signals pre_init # django的modal执行其构造方法前,自动触发 post_init # django的mo...

厚积而后薄发 1178

Django系列---Signal信号

一.Signal的作用 了解数据库的朋友们都知道触发器(Tragger),可以理解为通过某一个条件触发另一个事件的发生,使用场景十分广泛。比如在电子商城项目中,在增加一个商品的时候,需要把这个增加商品的消息通知给每个店铺的关注者。当然,在POST视图增加商品的代码后面,加上通知的函数就可以完成这个需求。但是如果这个时候增加一个新需求,在更新商品的时候也需要通知店铺的关注者,这个时候怎么实现更加优雅呢? 二.Signal详解 Django框架的信号机制充斥在各个操作环节中,有多...

zyz930929的博客 643

Django—信号 signal_django signal例子(1),面试必备

除了Django为我们提供的内置信号(比如前面列举的那些),很多时候,我们需要自己定义信号。所有的信号都是的实例。

2401_84247760的博客 1012

django signal 拾遗

首先看看Signal类的一些主要的接口。 classSignal(object): def__init__(self,providing_args=None,use_caching=False): ...... defconnect...

chuiyan0987的博客 155

[转]django拾遗之signal

在web开发中, 你可能会遇到下面这种场景: 在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后,你要发送一份确认邮件.当然你可以把逻辑写在一起, 但是有个问题是, 通常前置动作(触发操作)会不止一种(如用户更改了其它信息的确认邮件), 这时候这个逻辑会需要写多次, 所以你可能会想着DRY, 于是你把它写到了一个函数中,每次调用. 当然这是没问题的.但是, 如果你换个思路...

麻烦处... 214
上一篇: django signal
下一篇: Python字符编码详解
youbo_sun
博客等级 码龄12年 20粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值