深入学习Django源码基础16 - django中信号的学习分析

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

在django中有1个比较好玩的技术。那就是信号的绑定和接受技术。

从项目开发的角度,django中的信号处理技术属于辅助功能。流程并不清晰。

django提供的信号有

class_prepared = Signal(providing_args=["class"])

pre_init = Signal(providing_args=["instance", "args", "kwargs"])
post_init = Signal(providing_args=["instance"])

pre_save = Signal(providing_args=["instance", "raw", "using", "update_fields"])
post_save = Signal(providing_args=["instance", "raw", "created", "using", "update_fields"])

pre_delete = Signal(providing_args=["instance", "using"])
post_delete = Signal(providing_args=["instance", "using"])

post_syncdb = Signal(providing_args=["class", "app", "created_models", "verbosity", "interactive"])

m2m_changed = Signal(providing_args=["action", "instance", "reverse", "model", "pk_set", "using"])

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

分析信号的原理。可以看出来。

在信号内部主要通过receiver和sender(允许为None)的key组合来保存信号槽。

当send发送信号时候。通过遍历信号槽列表。判断sender是否允许。如果允许,则调用函数。

有1点可以确定的是,信号使用的是单件方式。也就是说要全局唯一性。使用太多对性能是一种负担。因此最好只实现Django自带的就可以了。


下面是抽出来的演示代码

from django.dispatch import saferef
import weakref

def _make_id(target):
    if hasattr(target, '__func__'):
        return (id(target.__self__), id(target.__func__))
    return id(target)

import threading
WEAKREF_TYPES = (weakref.ReferenceType, saferef.BoundMethodWeakref)

class Signal(object):

    def __init__(self):
        self.receivers = []
        self.lock = threading.Lock()

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
        import inspect
        assert callable(receiver) , "Signal receivers must be callable."

        try:
            argspec = inspect.getargspec(receiver.__call__)
        except (TypeError, AttributeError):
            argspec = None
        if argspec:
            assert argspec[2] is not None, \
                    "Signal receivers must accept keyword arguments (**kwargs)."

        if dispatch_uid:
            lookup_key = (dispatch_uid, _make_id(sender))
        else:
            lookup_key = (_make_id(receiver), _make_id(sender))

        if weak:
            receiver = saferef.safeRef(receiver, onDelete=self._remove_receiver)

        with self.lock:
            for r_key, _ in self.receivers:
                if r_key == lookup_key:
                    break
            else:
                self.receivers.append((lookup_key, receiver))

    def disconnect(self, receiver=None, sender=None, weak=True, dispatch_uid=None):
        if dispatch_uid:
            loopup_key = (dispatch_uid, _make_id(sender))
        else:
            loopup_key = (_make_id(receiver), _make_id(sender))

        with self.lock:
            for index in xrange(len(self.receivers)):
                (r_key, _) = self.receivers[index]
                if r_key == loopup_key:
                    del self.receivers[index]
                    break

    def has_listeners(self, sender=None):
        return bool(self._live_receivers(_make_id(sender)))

    def send(self, sender, **named):
        responses = []
        if not self.receivers:
            return responses

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

    def _live_receivers(self, senderkey):
        none_senderkey = _make_id(None)
        receivers = []

        for (receiverKey, r_senderkey), receiver in self.receivers:
            if r_senderkey == none_senderkey or r_senderkey == senderkey:
                if isinstance(receiver, WEAKREF_TYPES):
                    receiver = receiver()
                    if receiver is not None:
                        receivers.append(receiver)
                else:
                    receivers.append(receiver)
        return receivers

    def _remove_receiver(self, receiver):
        with self.lock:
            to_remove = []
            for key, connected_receiver in self.receivers:
                if connected_receiver == receiver:
                    to_remove.append(key)
            for key in to_remove:
                last_idx = len(self.receivers) - 1
                for idx, (r_key, _)  in enumerate(reversed(self.receivers)):
                    if r_key == key:
                        del self.receivers[last_idx - idx]



signal_demo = Signal()

def reset_queries(**kwargs):
    print 'reset_querys [%s]' % str(kwargs)
signal_demo.connect(reset_queries)

class objDemo(object):
    def click(self):
        signal_demo.send(sender=self.__class__, request={"1":1})

obj = objDemo()
obj.click()

打印输出

reset_querys [{'signal': <__main__.Signal object at 0x109be5290>, 'request': {'1': 1}, 'sender': <class '__main__.objDemo'>}]


Django在Ubuntu 16.04上连接PostgreSQL实战指南 PostgreSQL是Python Web开发中高可靠性、强事务支持的关系型数据库代表,其JSONB、行级锁等特性与Django深度协同;Django作为成熟Python Web框架,依赖psycopg2驱动实现数据库交互。在老旧但广泛存在的Ubuntu 16.04系统上,因glibc版本低、Python多版本共存、peer认证机制及pg_config路径错配等问题,Django常出现‘role does not exist’、‘libpq.so.5 not found’等典型连接失败。本文聚焦生产级落地, 阅读详情

相关推荐

Ubuntu 16.04 搭建 Django 4.2 开发环境:pyenv + venv 零 sudo 实践

Django 是基于 Python 的高阶 Web 框架,其运行依赖明确的 Python 版本、隔离的包管理及安全的权限控制。在 Ubuntu 16.04 这类老旧 LTS 系统中,系统自带 Python 3.5 与 Django 4.2+(要求 Python ≥3.8)存在天然版本断层;同时,全局 pip 安装极易破坏 apt 包管理器稳定性。因此,必须采用 pyenv 管理多版本 Python,配合 venv 构建用户级虚拟环境——这不仅是工程最佳实践,更是规避 sudo 权限风险、实现可复现开发环境的

weixin_34348805的博客 300

03.celery发送短信接口

1.使用celery异步发送短信 1.1 在celery_task/mian.py中添加发送短信函数 # celery项目中的所有导包地址, 都是以CELERY_BASE_DIR为基准设定. # 执行celery命令时, 也需要进入CELERY_BASE_DIR目录执行. CELERY_BASE_DIR = os.path.dirname(os.path.abspath(__file__)) @app.task(bind=True) def send_sms_code(self, mobile, dat

weixin_45839321的博客 292

python django高质量教学视频

python django高质量教学视频,带你深入领会django的独特魅力。

Django进阶 ----信号机制

文章目录1. 工作机制2. 应用场景3. 示例4. 常用内置信号5. 信号监听函数6. 自定义信号1. 自定义信号2. 触发信号3. 关联监听函数与信号 1. 工作机制 Django 中的信号工作机制依赖三个主要要素: 发送者(sender):信号的发出方,可以是模型,也可以是视图。当某个操作发生时,发送者会发出信号 信号(signal):发送的信号本身。Django内置了许多信号,比如模型保存后发出的post_save信号。 接收者(receiver):信号的接收者,其本质是一个简单的回调函数。将这个函

sGDUTBMW的博客 1117

DSP配置I2C通讯(非IO口软件模拟时序)

dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤 1.E

weixin_44387442的博客 5544

用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南

本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。

weixin_42549451的博客 202

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

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

linjun的博客 889

基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现

该项目旨在开发一个基于YOLO11的无人机目标检测系统,能够实时识别并定位无人机拍摄过程中捕捉的小目标。考虑到无人机拍摄的目标通常较小,系统将采用特定的调优策略,以提高小目标的检测精度和召回率。

m0_73723097的博客 1205

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

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

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

TAS5805MPWPR实战:数字音频功放从选型到量产全流程指南

数字音频功放将I2S数字信号直接转为PWM驱动扬声器,省去传统DAC与模拟运放链路,在高保真、低BOM与紧凑PCB之间找到平衡。其核心在于内置可编程DSP,支持多段PEQ、DRC等数字处理,通过I2C配置即可完成调音,而不占用主控算力。这类方案广泛应用于蓝牙音箱、Soundbar、智能音频模组等产品,但实际落地时常遇到I2C通信不稳定、EQ未生效、底噪超标、DC检测误触发等工程问题。从电源布局、LC滤波参数到PurePath Console工具链的使用,再到量产固件加载与故障排查,都需要系统化方法论支撑。本

weixin_29164843的博客 219

【Unity3D】RTS Engine 笔记一

RTS Engine 中配置一个新场景, 初步认识GameManager、设置地形以及配置地形网格搜索

ViYeye的博客 1648

Django内置权限系统源码解读

带领大家熟悉Django自带的权限系统原理,如果自定义内置权限操作和基于用户的权限的添加、删除;以及admin后台如何判断权限

Colinspace 942

别再只盯着Text-VQA了!这4个主流VQA数据集(含中英双语)的保姆级下载与对比指南

本文深入解析了Text-VQA、ST-VQA、OCR-VQA和EST-VQA这4个主流视觉问答数据集的特性与应用场景,提供了详细的下载与预处理指南。通过对比分析,帮助开发者根据项目需求选择最适合的数据集,避免因选型不当导致的模型性能问题,特别适合需要处理中英双语或多模态文本理解的AI项目。

weixin_42524708的博客 360

Python Django 5 Web应用开发实战

本文主要介绍了Python Django 5 Web应用开发实战,希望能对学习Python Web应用开发的同学们有所帮助。 文章目录 1. 前言 2. 书籍推荐 2.1 内容简介 2.2 本书作者 2.3 本书目录 2.4 适合读者 3. 购买链接

weixin_43178406的博客 2万+

【护网必备】Windows平台shellcode免杀加载器

bypass:McAfee、金山(数字签名)、火绒、ESET、卡巴企业版(时间5s 抖动50 Sleep_mask)、360全家桶(物理机)、Norton(加白程序资源)、WDF(PC)、WDF(Server)、Symantec(加白程序资源)bypass:金山(数字签名)、火绒、ESET、360全家桶(物理机)、WDF(PC)、WDF(服务器提示复查(关云保护))、McAfee、Norton(加白程序资源)、卡巴企业版(时间5s 抖动50 Sleep_mask)必须使用Bof操作,shell运行就掉线。

Fly_鹏程万里 1186

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

django-debug-toolbar高级调试:信号与中间件监控

在Django开发中,信号(Signals)和中间件(Middleware)是实现解耦和请求处理的核心机制,但它们的隐式执行流程往往成为调试难点。django-debug-toolbar提供了专门的监控工具,帮助开发者可视化信号传递和中间件执行过程。本文将深入解析如何利用这些高级功能定位复杂的请求处理问题。 ## 信号监控:追踪应用解耦机制 Django信号系统允许组件间通过事件进行通信,但过...

gitblog_01099的博客 668

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Django ASGIHandler 源码 - DB连接部分

无论是asgi还是wsgi协议,均已application为调用入口点 1. asgi入口点 def get_asgi_application(): """ The public interface to Django's ASGI support. Return an ASGI 3 callable. Avoids making django.core.handlers.ASGIHandler a public API, in case the internal impl

qq_36274515的博客 799

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

我基于Python+Django+Vue 构建了商城管理系统(附源码)

平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、商品详情页、用户中心模块。后台功能包括:总览、订单管理、商品管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。

m0_59596937的博客 2761

基于深度学习的电商评论情感分析系统(源码+定制+开发)

【技术博主阿龙简介】专注Java技术领域,10W+粉丝,优快云特邀作者,提供毕业设计辅导及技术分享。技术涵盖SpringBoot、Vue、大数据等全栈开发。 【Python图像识别项目】基于YOLO目标检测算法(16类编号目标识别)和PyQt图形界面开发。系统采用轻量级SQLite数据管理,集成图像处理、多边形分析、中文标注等功能。 【核心功能】实时检测(精度99.6%)、可视化分析(面积/周长/圆度计算)、跨平台部署。提供完整文件架构说明和训练日志,支持模型性能优化与扩展应用。

程序员阿龙的博客 1084

Django全栈开发:构建Python可视化学习系统

数据可视化是现代Web开发中的关键技术,通过将复杂数据转化为直观图表,帮助用户快速理解信息。Django作为Python最流行的Web框架,提供了完整的MVT架构,能够高效实现前后端数据交互。本案例展示了如何利用Django+Chart.js构建学习分析系统,涉及模型设计、视图逻辑和模板渲染全流程。项目特别适合Python全栈开发初学者,通过实战掌握Django核心功能与可视化集成技巧,理解从开发到部署的完整生命周期。关键技术点包括SQLite数据库操作、WSGI部署配置和前端ECharts集成,为后续开发

406

计算机毕业设计Django+Vue.js深度学习股票行情分析预测 量化交易分析 大数据毕业设计(源码+LW文档+PPT+讲解)

计算机毕业设计Django+Vue.js深度学习股票行情分析预测 量化交易分析 大数据毕业设计(源码+LW文档+PPT+讲解)

全网计算机/大数据辅导(自媒体)道祖第一人、全网粉丝100W+,专注于大学生项目实战开发,讲解,毕业答疑辅导,高校老师/讲师/同行合作。以及产品测评宣传、工具推广等合作。同时招收学生代理、校园代理。 980

django models索引_Django 开发学习笔记

点击上方“Python Web与Django大咖之路”关注我!小编我对Python Web开发和Django充满热情,专注于点点滴滴的技术总结文章和实战代码分享。如果聪明勤奋的你也对Python基础、Django后端、数据库知识、Linux使用、Nginx使用等领域感兴趣,欢迎关注我的微信公众号【Python Web与Django大咖之路】啊。每天学习进步一点点,静觅,静静寻觅生活的美...

weixin_35363895的博客 192

基于Python+Django,开发一款房屋租赁系统

平台采用B/S结构,后端采用主流的Python+Django进行开发,前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。前台功能包括:首页、房屋详情页、用户中心模块。后台功能包括:总览、房屋管理、分类管理、标签管理、评论管理、用户管理、运营管理、日志管理、系统信息模块。

m0_59596937的博客 1829

Django认证选型指南:为什么django-allauth是生产级首选

在Web开发中,用户认证是基础但高风险模块,涉及邮箱验证、第三方登录(OAuth2/OpenID Connect)、双因素认证(TOTP)等多重协议与安全策略。其核心原理在于将身份凭证抽象为可插拔的分层模型——基础账号、社交身份、增强安全——而非耦合在单一User模型中。技术价值体现在错误诊断精准、配置驱动扩展、信号机制解耦,显著降低线上故障率。典型应用场景包括SaaS平台对接企业微信、政务系统集成省级统一认证、电商项目实现微信扫码+邮箱双注册。django-allauth正是基于这一设计哲学,在Djang

WGH100817的博客 854

python进阶学习路线(全)

学习路线: 1.硬件: 1、操作系统简介 2、第二篇:操作系统 2.linux基础: 1、初始Linux 2、基本使用 3、Linux进阶 3.python基础 : 1、python基础大纲 2、变量与交互 3、快捷键 4...

weixin_34075551的博客 1万+
上一篇: 深入学习Django源码基础15 - views简要分析学习
下一篇: web性能测试工具ab
watsy
博客等级 码龄19年 133粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值