首页 > 其他分享 >信号

信号

时间:2024-06-24 08:59:52浏览次数:23  
标签:触发 signal django signals 信号 print

信号

一 信号是什么

# 1 Flask框架中的信号基于blinker,其主要就是让开发者可以在flask请求过程中定制一些用户行为
# 2 信号是典型的 观察者模式
	-触发某个事执行【模板准备渲染】
    -绑定信号:可以绑定多个
    	只要模板准备渲染--》就会执行这几个绑定的新--》函数
        
        
# 3 面向切面编程(AOP)--》一种方案
	-整个程序正常运行,但是我们可以把一部分代码,插入到某个位置执行
    -钩子函数:只要写了,程序走到哪,就会执行,没写,就不会执行
    	-序列化类的校验
	
# 4 通过信号可以做什么事?
	-在框架整个执行过程中,插入一些代码执行
    	比如:记录某个页面的访问量
    	比如:每次渲染 login.html --->都记录日志
        比如:程序出异常---》记录日志
        比如:用户表中有个用户创建--》给这个用户发点短信
        比如:用户下了订单---》发个邮件通知,让它尽快付款
        
        比如:轮播图表只要发生变化,就删缓存:django中内置信号

二 flask中信号的使用

request_started = _signals.signal('request-started')                # 请求到来前执行
request_finished = _signals.signal('request-finished')              # 请求结束后执行
 
before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行
 
got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行
 
request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
 
appcontext_pushed = _signals.signal('appcontext-pushed')            # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped')            # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触发

1 内置信号的使用

使用步骤:

  1. 写一个函数

    def func1(*args,**kwargs):
        print('模板渲染了')
        print(args)
        print(kwargs.get('template').name)
    
  2. 跟内置信号绑定

    from flask import signals
    signals.before_render_template.connect(func1)
    
  3. 等待触发(自动)

2 自定义信号

使用步骤:

  1. 定义一个自定义信号

    from flask.signals import _signals
    create_user = _signals.signal('create_user')
    
  2. 写一个函数

    def func1(*args, **kwargs):
        print('自定义信号执行了')
        print(args)
        print(kwargs)
    
  3. 跟内置信号绑定

create_user.connect(func1)
  1. 等待触发(手动)

     create_user.send()
    

三 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          # 创建数据库连接时,自动触发

1 内置信号使用

  1. 写一个函数

    def callBack(sender, **kwargs):
        # 过滤banner表   :kwargs就有表名
    	print('对象保存了')
    
  2. 跟内置信号绑定

    from django.db.models.signals import pre_save
    post_save.connect(callBack)
    
  3. 等待触发(自动的)

绑定方式二,使用装饰器

from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save)
def my_callback(sender, **kwargs):
    print("对象创建成功")
    print(sender)
    print(kwargs)

2 自定义信号

# 1 定义信号(一般创建一个py文件)(toppings,size 是接受的参数)
import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

#2  写个函数注册信号
def callback(sender, **kwargs):
    print("callback")
    print(sender,kwargs)
pizza_done.connect(callback)

# 3 触发信号
from 路径 import pizza_done
pizza_done.send(sender='seven',toppings=123, size=456)

四 用信号的好处

代码侵入性低---》解耦

五 信号和信号量

# 信号:signal 
	-flask,django中得 观察者模式  --》信号机制
    
# 信号量:Semaphore
	-并发编程中概念
    在Python中,信号量(Semaphore)主要用来控制多个线程或进程对共享资源的访问。信号量本质上是一种计数器的锁,它维护一个许可(permit)数量,每次 acquire() 函数被调用时,如果还有剩余的许可,则减少一个,并允许执行;如果没有剩余许可,则阻塞当前线程直到其他线程释放信号量

标签:触发,signal,django,signals,信号,print
From: https://www.cnblogs.com/unrealqcc/p/18264306

相关文章

  • 音频信号处理入门-第二周
    音频信号处理学习-第二周语音识别模型的基本思路前端处理信号预处理:对输入的语音信号进行预处理,包括去噪、预加重(强调高频成分)、分帧和加窗(通常使用汉明窗)。特征提取梅尔频率倒谱系数(MFCC):从预处理后的语音信号中提取特征,最常用的是梅尔频率倒谱系数(MFCC)。其他常用的特征包括......
  • 【操作系统】信号Signal超详解|捕捉函数
    ......
  • 【七】【QT开发应用】跨UI发送信号,跨线程发送信号
    跨UI发送信号基本框架新建窗口自定义信号跨线程发送信号新建线程查看线程号完整代码跨UI发送信号setdialog.h#ifndefSETDIALOG_H#defineSETDIALOG_H#include<QDialog>namespaceUi{classsetdialog;}class......
  • 一问搞懂Linux信号【上】
    Linux信号在Linux系统中的地位仅此于进程间通信,其重要程度不言而喻。本文我们将从信号产生,信号保存,信号处理三个方面来讲解信号。......
  • django中的信号机制
    django中的信号机制1.1什么是信号机制#什么是信号机制Django框架包含了一个信号机制,它允许若干个发送者(sender)通知一组接收者(receiver)某些特定操作或事件(events)已经发生了,接收者收到指令信号(signals)后再去执行特定的操作。1.2信号的工作机制Django中的信号工作机......
  • 探索信号世界的奥秘:MATLAB中的傅里叶变换、滤波器与FFT仿真设计
    探索信号世界的奥秘:MATLAB中的傅里叶变换、滤波器与FFT仿真设计一、引言:信息技术的脉搏——信号处理二、技术概述:理论与实践的桥梁傅里叶变换滤波器设计FFT(快速傅里叶变换)代码示例:基本FFT应用三、技术细节:深入理解背后的数学原理傅里叶变换原理滤波器设计原理FFT算法解......
  • 基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
    1.算法运行效果图预览    2.算法运行软件版本MATLAB2022a 3.部分核心程序P=[Dat1_wav1;Dat1_wav2;Dat2_wav1;Dat2_wav2;Dat3_wav1;Dat3_wav2;Dat4_wav1;Dat4_wav2];T=[ones(800,1);2*ones(800,1);3*ones(800,1);4*ones(800,1)];%GRNN训练net=newgrnn(......
  • qt开发-03——信号与槽
    信号与槽(Signal&Slot)是Qt编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。信号(Signal)就是在特定情况下被发射的事件,例如PushButton最常见的信号就是鼠标单击时发射的clicked()信号,一个ComboBox......
  • 基于AD9009的PCIe射频信号采集回放卡
    基于AD9009的PCIe射频信号采集回放卡PCIe射频收发平台75MHz至调谐范围200MHz瞬时带宽基于RF-IC芯片PCIe射器和接收器、集成式频率合成器以及数字信号处理功能。满足3G、4G和5G宏蜂窝时分双工(TDD)基站应用要求。接收链路由两个独立的带宽、直接变频接收器组成,具有出色的动射频......
  • 485总线8路4~20mA模拟量采集模块DAM3158A电压电流信号可同时采集
    阿尔泰科技485总线模拟量采集模块DAM3158A电压电流信号采集简要介绍:     阿尔泰科技DAM3158A/3158系列为8路模拟量输入,RS485通讯接口,带有标准ModbusRTU协议。可方便链接:组态王、力控、易控、MCGS等组态软件同时也可以和昆仑通态、威纶通等触摸屏及无线DTU一起使......