Flask 缓存和信号
Flask-Caching
Flask-Caching 是 Flask 的一个扩展,它为 Flask 应用提供了缓存支持。缓存是一种优化技术,可以存储那些费时且不经常改变的运算结果,从而加快应用的响应速度。
一、初始化配置
安装 Flask-Caching 扩展:
pip3 install Flask-Caching
配置说明:
CACHE_TYPE
: 指定缓存类型。可以是 “null”(无缓存)、“simple”(简单缓存)、“redis”、“memcached” 等。简单缓存(SimpleCache)是内存中的缓存,不需要额外的缓存服务器。CACHE_DEFAULT_TIMEOUT
: 缓存项的默认过期时间(秒)。
示例代码:
from flask import Flask
from flask_caching import Cacheconfig = {"DEBUG": True, # Flask 的调试模式"CACHE_TYPE": "SimpleCache", # 使用简单缓存"CACHE_DEFAULT_TIMEOUT": 300 # 缓存默认超时时间(5分钟)
}app = Flask(__name__)
app.config.from_mapping(config)
cache = Cache(app) # 初始化缓存对象
二、使用缓存
在路由中,可以使用 cache.set
方法来设置一个缓存项,使用 cache.get
方法来获取缓存项。
设置缓存:
@app.route('/')
def index():cache.set('name', 'bruce') # 设置缓存项return 'index'
获取缓存:
@app.route('/get')
def get():res = cache.get('name') # 获取缓存项 return res if res else 'Not cached'
注意:cache.get
方法在缓存项不存在或已过期时将返回 None
,所以在返回结果时你可能需要检查它是否为 None
。
三、缓存到 Redis
如果想使用 Redis 作为缓存后端,你需要安装 Redis 服务器和 redis
Python 包,并更改 CACHE_TYPE
配置:
pip3 install redis
然后,配置 Flask 应用使用 Redis:
config = {"CACHE_TYPE": "RedisCache", # 使用 Redis 缓存# 配置 Redis 服务器地址和端口"CACHE_REDIS_URL": "redis://localhost:6379/0"# 其他 Redis 相关配置...
}
使用 Flask-Caching 可以显著提高应用的性能,特别是在处理那些计算密集型或数据库密集型的请求时。不过,需要注意合理配置缓存的过期时间,以避免缓存的数据过时。
Flask信号
一、简单介绍
信号的概念
- 信号 是一种松耦合的通信方式,允许对象间的交互而不需要显式调用对方的方法。
- 在 Flask 和 Django 中,信号可以用于监听和响应框架的特定事件,如请求开始、模板渲染、模型保存等。
信号与信号量的区别
- 信号(Signal)是观察者模式的一种实现,用于事件通知和通信。
- 信号量(Semaphore)是并发编程中用于控制对共享资源访问的计数器锁。
信号的好处
- 低侵入性:信号允许在不修改现有代码的基础上,添加新的功能或行为。
- 解耦:信号可以降低代码间的依赖关系,提高模块化。
面向切面编程(AOP)
- 这种编程范式允许开发者定义跨多个对象的横切关注点(cross-cutting concerns),如日志、事务管理等。信号可以看作是AOP的一种实现方式。
信号与请求扩展的关系
- 信号可以完成之前在请求扩展中完成的事情。
- 它们的机制不同:请求扩展通常通过装饰器或中间件来修改请求处理流程,而信号则是在特定事件发生时触发。
- 信号更为丰富,可以在更多的事件点进行操作。
二、内置信号的使用
1.Flask内置信号
request_started
:在请求到来前执行。request_finished
:在请求结束后执行。before_render_template
:在模板渲染前执行。template_rendered
:在模板渲染后执行。got_request_exception
:在请求执行出现异常时执行。request_tearing_down
:在请求执行完毕后自动执行(无论成功与否)。appcontext_tearing_down
:在应用上下文执行完毕后自动执行(无论成功与否)。appcontext_pushed
:在应用上下文push时执行。appcontext_popped
:在应用上下文pop时执行。message_flashed
:当调用flask.flash
在其中添加数据时,自动触发。
2.简单使用
以下是使用before_render_template
信号的示例:
-
编写一个响应信号的函数:这个函数会在信号被触发时执行。
def func1(*args, **kwargs):print('模板渲染了')print(args)print(kwargs.get('template').name)if 'index.html' == kwargs.get('template').name:print('记日志了')
这个函数接收任意数量的位置参数和关键字参数,并检查模板的名称。如果模板是
index.html
,它将打印一条日志消息。 -
将函数绑定到信号:使用
connect
方法将函数绑定到before_render_template
信号。from flask import signals signals.before_render_template.connect(func1)
这样,每当模板渲染之前,
func1
都会被调用。 -
等待信号触发:通过正常的路由和模板渲染流程,信号会被自动触发。
@app.route('/<string:name>') def index(name):return render_template('index.html', name=name)@app.route('/login') def login():return render_template('login.html')
当访问
/
或/login
路径时,对应的模板将被渲染,并且在渲染之前,func1
会被调用。
三、flask自定义信号
1.自定义信号的步骤
- 自定义信号:使用
flask.signals._signals.signal
来创建一个新的信号。 - 编写响应函数:这个函数会在信号被触发时执行。
- 将函数绑定到自定义信号:使用
connect
方法将函数绑定到你的自定义信号上。 - 手动触发信号:在应用程序逻辑中,当满足特定条件时,手动发送(触发)信号。
2.示例
from flask import Flask, request from flask.signals import _signalsapp = Flask(__name__) app.debug = True# 定义一个自定义信号 create_user_signal = _signals.signal('create_user') # 修改信号名称以避免混淆# 编写回调函数,当自定义信号触发时执行 def func1(*args, **kwargs):print('自定义信号执行了', kwargs)# 将回调函数绑定到自定义信号 create_user_signal.connect(func1)def create_user_handler(sql, name):# 触发自定义信号,传递额外的参数create_user_signal.send(name=name) # 使用正确的信号对象来发送信号# 数据库操作...print(sql % name)@app.route('/create_user/<name>') def create_user(name):print('创建用户', name)sql = 'insert into user (name) values (%s)'create_user_handler(sql, name)return f'创建用户{name} 成功'if __name__ == '__main__':app.run()
四、Django中的信号
1.内置信号
- Model signals:与模型操作相关的信号。
pre_init
:在模型实例初始化之前触发。post_init
:在模型实例初始化之后触发。pre_save
:在模型实例保存之前触发。post_save
:在模型实例保存之后触发。pre_delete
:在模型实例删除之前触发。post_delete
:在模型实例删除之后触发。m2m_changed
:在多对多字段改变时触发。class_prepared
:在应用启动时,模型类准备好后触发。
- Management signals:与数据库迁移相关的信号。
pre_migrate
:在执行迁移命令之前触发。post_migrate
:在执行迁移命令之后触发。
- Request/response signals:与请求和响应相关的信号。
request_started
:在请求开始时触发。request_finished
:在请求结束时触发。got_request_exception
:在请求处理中出现异常时触发。
- Test signals:与测试相关的信号。
setting_changed
:在测试中修改设置时触发。template_rendered
:在测试中渲染模板时触发。
- Database Wrappers:
connection_created
:在创建数据库连接时触发。
2.信号的使用
- 写一个函数
from django.db.models.signals import pre_save
import loggingdef callBack(sender, **kwargs):# 这里可以添加逻辑,例如过滤特定的表print('对象保存了')# 可以在这里执行异步任务,比如使用 Celery
-
绑定信号
-
方法一:直接使用
connect
方法。 -
pre_save.connect(callBack)
-
方法二:使用装饰器
@receiver
。 -
from django.dispatch import receiver@receiver(pre_save) def my_callback(sender, **kwargs):print("对象创建成功")print(sender)print(kwargs)
-
3. 自定义信号
-
定义信号:使用
django.dispatch.Signal
创建一个新的信号。 -
编写回调函数:创建一个函数来响应信号。
-
连接信号:使用信号的
connect
方法将回调函数与信号连接。 -
触发信号:在适当的位置使用信号的
send
方法来手动触发信号。 -
示例
-
import django.dispatch# 定义信号 pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])# 编写回调函数 def callback(sender, **kwargs):print("Pizza is ready!")print(sender, kwargs)# 连接信号 pizza_done.connect(callback)# 触发信号 pizza_done.send(sender='seven', toppings='pepperoni', size='large')
-
相关文章:
Flask 缓存和信号
Flask-Caching Flask-Caching 是 Flask 的一个扩展,它为 Flask 应用提供了缓存支持。缓存是一种优化技术,可以存储那些费时且不经常改变的运算结果,从而加快应用的响应速度。 一、初始化配置 安装 Flask-Caching 扩展: pip3 i…...

基于weixin小程序农场驿站系统的设计
管理员账户功能包括:系统首页,个人中心,农场资讯管理,用户管理,卖家管理,用户分享管理,分享类型管理,商品信息管理,商品类型管理 开发系统:Windows 架构模式…...
JAVA将List转成Tree树形结构数据和深度优先遍历
引言: 在日常开发中,我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回,或者需要对转为树结构后的数据绑定层级关系再返回,比如需要统计当前节点下有多少个节点等,因此我们需要封装一个ListToTree的工具类…...
设计模式——开闭、单一职责及里氏替换原则
设计原则是指导软件设计和开发的一系列原则,它们帮助开发者创建出易于维护、扩展和理解的代码。以下是你提到的几个关键设计原则的简要说明: 开闭原则(Open/Closed Principle, OCP): 开闭原则由Bertrand Meyer提出&am…...

代码随想录算法训练营第59天:动态[1]
代码随想录算法训练营第59天:动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。 示例: 输入: …...

jvm性能监控常用工具
在java的/bin目录下有许多java自带的工具。 我们常用的有 基础工具 jar:创建和管理jar文件 java:java运行工具,用于运行class文件或jar文件 javac:java的编译器 javadoc:java的API文档生成工具 性能监控和故障处理 jps jstat…...

ISP IC/FPGA设计-第一部分-SC130GS摄像头分析-IIC通信(1)
1.摄像头模组 SC130GS通过一个引脚(SPI_I2C_MODE)选择使用IIC或SPI配置接口,通过查看摄像头模组的原理图,可知是使用IIC接口; 通过手册可知IIC设备地址通过一个引脚控制,查看摄像头模组的原理图ÿ…...
HTTP协议头中X-Forwarded-For是能做什么?
X-Forwarded-For和相关几个头部的理解 $remote_addr 是nginx与客户端进行TCP连接过程中,获得的客户端真实地址. Remote Address 无法伪造,因为建立 TCP 连接需要三次握手,如果伪造了源 IP,无法建立 TCP 连接,更不会有后…...

Linux高并发服务器开发(八)Socket和TCP
文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点:出错重传 每次发送数据对方都会回ACK,可靠 tcp是打电话的模型,建立连接 使用连接 关闭连接…...
力扣第220题“存在重复元素 III”
在本篇文章中,我们将详细解读力扣第220题“存在重复元素 III”。通过学习本篇文章,读者将掌握如何使用桶排序和滑动窗口来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述…...

Qt实战项目——贪吃蛇
一、项目介绍 本项目是一个使用Qt框架开发的经典贪吃蛇游戏,旨在通过简单易懂的游戏机制和精美的用户界面,为玩家提供娱乐和编程学习的机会。 游戏展示 二、主要功能 2.1 游戏界面 游戏主要是由三个界面构成,分别是游戏大厅、难度选择和游戏…...

Windows 10,11 Server 2022 Install Docker-Desktop
docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 docker-compose Compose 是用于定义和运行…...
C++中的RAII(资源获取即初始化)原则
C中的RAII(Resource Acquisition Is Initialization,资源获取即初始化)原则是一种管理资源、避免资源泄漏的惯用法。RAII是C之父Bjarne Stroustrup提出的设计理念,其核心思想是将资源的获取(如动态内存分配、文件句柄、…...

【机器学习】Whisper:开源语音转文本(speech-to-text)大模型实战
目录 一、引言 二、Whisper 模型原理 2.1 模型架构 2.2 语音处理 2.3 文本处理 三、Whisper 模型实战 3.1 环境安装 3.2 模型下载 3.3 模型推理 3.4 完整代码 3.5 模型部署 四、总结 一、引言 上一篇对ChatTTS文本转语音模型原理和实战进行了讲解&a…...
ubuntu22.04 编译安装openssl C++ library
#--------------------------------------------------------------------------- # openssl C library # https://www.openssl.org/source/index.html #--------------------------------------------------------------------------- cd /opt/download # 下载openssl-3.0.13…...

百度Agent初体验(制作步骤+感想)
现在AI Agent很火,最近注册了一个百度Agent体验了一下,并做了个小实验,拿它和零一万物(Yi Large)和文心一言(ERNIE-4.0-8K-latest)阅读了相同的一篇网页资讯,输出资讯摘要࿰…...
7-491 3名同学5门课程成绩,输出最好成绩及所在的行和列(二维数组作为函数的参数)
编程:数组存储3名同学5门课程成绩 输出最好成绩及所在的行和列 要求:将输入、查找和打印的功能编写成函数 并将二维数组通过指针参数传递的方式由主函数传递到子函数中 输入格式: 每行输入一个同学的5门课的成绩,每个成绩之间空一格,见输入…...

OpenCloudOS开源的操作系统
OpenCloudOS 是一款开源的操作系统,致力于提供高性能、稳定和安全的操作系统环境,以满足现代计算和应用程序的需求。它结合了现代操作系统设计的最新技术和实践,为开发者和企业提供了一个强大的平台。本文将详细介绍 OpenCloudOS 的背景、特性…...
排序题目:多数元素 II
文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 前言解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题:多数元素 II 出处:229. 多数元素 II 难度 3 级 题目描述 …...

<电力行业> - 《第1课:电力行业的五大四小》
1 什么是电力行业的五大四小? 我们常说的电力行业的五大四小,指的是电力行业有实力的公司,分为:较强梯队的五大集团、较弱梯队的四小豪门。 五个实力雄厚的集团,分别是: 中国华能集团公司中国大唐集团公…...

智能问数Text2SQL Vanna windows场景验证
架构 Vanna 是一个开源 Python RAG(检索增强生成)框架,用于 SQL 生成和相关功能。 机制 Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回 SQL 查询,这些查…...

fast-reid部署
配置设置: 官方库链接: https://github.com/JDAI-CV/fast-reid# git clone https://github.com/JDAI-CV/fast-reid.git 安装依赖: pip install -r docs/requirements.txt 编译:切换到fastreid/evaluation/rank_cylib目录下&a…...
Java中Git基础操作详解(clone、commit、push、branch)
Git是Java开发者必备的版本控制工具,以下是核心操作的详细说明及示例: 一、Git基础概念 仓库(Repository):存储代码的目录,包含所有版本历史。提交(Commit)…...

大话软工笔记—架构模型
1. 架构模型1—拓扑图 (1)拓扑图概念 拓扑图,将多个软件系统用网络图连接起来的表达方式。 (2)拓扑图分类 总线型结构 比较普遍采用的方式,将所有的系统接到一条总线上。 星状结构 各个系统通过点到…...

html - <mark>标签
<mark> 标签在HTML中用于高亮显示文本,通常用于突出显示某些重要的部分。它的默认样式通常是背景色为黄色,但你可以通过CSS自定义其外观。 1. 基本用法 <mark> 标签用于标记文本的高亮显示。它常用于搜索结果中,突出显示匹配的…...

FPGA点亮ILI9488驱动的SPI+RGB接口LCD显示屏(一)
FPGA点亮ILI9488驱动的SPIRGB接口LCD显示屏 ILI9488 RGB接口初始化 目录 前言 一、ILI9488简介 二、3线SPI接口简介 三、配置寄存器介绍 四、手册和初始化verilog FPGA代码 总结 前言 ILI9488是一款广泛应用于嵌入式系统和电子设备的彩色TFT LCD显示控制器芯片。本文将介…...

低功耗高安全:蓝牙模块在安防系统中的应用方案
随着物联网(IoT)和智能家居的快速发展,安防行业正迎来前所未有的技术革新。蓝牙模块作为一种低功耗、高稳定性的无线通信技术,凭借其低成本、易部署和智能化管理等优势,在安防领域发挥着越来越重要的作用。本文将探讨蓝牙模块在安防系统中的应…...
【判断自整除数】2022-4-6
缘由是判断自整除数的,这个我的结果是正确的,但是提交就有运行错误是怎么回事啊-编程语言-CSDN问答 void 自整除数字() {//所谓的自整除数字就是该数字可以整除其每一个位上的数字。 //对一个整数n,如果其各个位数的数字相加得到的数m能整除n,则称n为自…...
MyBatis中foreach集合用法详解
在 MyBatis 中,<foreach> 标签用于遍历集合(Collection、List、Array、Map),常用于构建动态 SQL 语句(如 IN 查询、批量插入等)。以下是详细用法和示例: 核心属性 属性描述collection必填…...

【统计方法】树模型,ensemble,bagging, boosting
决策树基础 回归树 理论上,决策区域可以有任何形状。• 然而,我们选择将预测空间划分为高维矩形或框,这是为了简单和易于解释结果预测模型 目标:将预测空间划分为矩形区域,最小化残差平方和(RSS&#x…...