FastApi接口限流

  • 有个接口内容信息比较敏感,遂设置限流操作
    通常的限流操作就包括对某个用户或者某个IP进行限流,每分钟或者每天最多能访问多少次之类的等等。
  • FaslApi中的限流操作开源库SlowApi https://github.com/laurentS/slowapi
    这个库是根据flask-limiter改编而来,应该也是在FastApi中使用人数最多的一个库,但是感觉网上的资料比较少,我仔细看了一下,这个库本身所支持的功能也比较单一,很多个性化的操作还是需要自己来写。
    比如想根据用户类型来进行限流操作分级,官方没有提供支持,这个issue里个老哥实现了。https://github.com/laurentS/slowapi/issues/13
    还有一个问题是虽然默认支持内存计数,但是FastApi开多个workers跑时每个进程都会有自己独立的limit。想实现总体上的限流要加入redis作为backend。
  • SlowApi的简单用法
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.errors import RateLimitExceeded
from fastapi import FastAPI
from starlette.requests import Request
from setting import config, env
from extensions import loggerdef get_real_remote_address(request: Request) -> str:"""Returns the ip address for the current request (or 127.0.0.1 if none found)"""real_ip = request.client.hostif request and request.headers.getlist("X-Forwarded-For"):real_ip = request.headers.getlist("X-Forwarded-For")[0]logger.info(f"limit_ip: {real_ip}")return real_iplimiter = Limiter(key_func=get_real_remote_address, storage_uri=config[env].LIMIT_STORAGE)app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)# 接口中
@router.post("/query/detail")
@limiter.limit("200/day")
@limiter.limit("10/minute")
async def get_file_detail(request: Request
):

注意Request是必填的,看了一下他的源码,简单来说是通过一个key来生成一个计数器,超过设定的计数即返回code: 429。

  • 甚至可以模仿其操作来实现更加自由的自定义限流
    先准备好Redis,主要是使用Redis中的setex()命令。
import redis
from setting import config, env
from extensions import loggerdef create_redis():return redis.ConnectionPool(host='10.10.10.00',port=6379,password=111111,db=5 if env == "production" else 4,decode_responses=True)pool = create_redis()

接口中定义

def get_redis():return redis.Redis(connection_pool=pool)@router.post("/query/detail")
@limiter.limit("200/day")
@limiter.limit("10/minute")
async def get_file_detail(request: Request,cache=Depends(get_redis)
):if not cache.get("LIMITS:total_limit_m"):cache.setex('LIMITS:total_limit_m', 60, 0)else:r_times = int(cache.get("LIMITS:total_limit_m"))if r_times > 20:return {"msg": "too many requests!"}ttl = cache.ttl("LIMITS:total_limit_m")cache.setex("LIMITS:total_limit_m", int(ttl), str(r_times + 1))

这样就实现了一个非常简单的限流器,生产环境慎用。严谨的实现要实现其原子操作,这个到后面有时间再填坑。

  • 一些不错的资料

https://blog.csdn.net/cqcre/article/details/124440748
https://developer.aliyun.com/article/974481
https://github.com/jintaekimmm/fastapi-simple-rate-limiter
https://blog.csdn.net/km_bandits/article/details/135568339

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/50342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣高频SQL 50题(基础版)第十三题

文章目录 力扣高频SQL 50题(基础版)第十三题570. 至少有5名直接下属的经理题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第十三题 570. 至少有5名直接下属的经理 题目说明 表: Employee ------…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分,它们各自有其特定的用途和优势。下面是它们之间的主要区别: Spring: Spring 是一个开源的轻量级Java开发框架,最初由Rod Johnson创建&…

MySQL零散拾遗(七)--- 突发奇想的一些疑虑

mysql中从2018-12-18提取出2018-12,如何实现 要在MySQL中从日期2018-12-18提取出2018-12,可以使用DATE_FORMAT()函数或者EXTRACT()函数。这两种方法都可以达到目的,下面是具体的实现方式: 使用 DATE_FORMAT() DATE_FORMAT()函数…

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置: 参考文档: https://source.android.google.cn/docs/setup/start?hlzh-cn Android系统开发指导 https://developer.android.google.cn/studio/run/device?hlru USB 调试配置 https://b…

Linux之存储桶minio单机安装和使用简介

一、minio简介 MinIO 是一个高性能的分布式对象存储系统,主要用于存储非结构化数据,例如照片、视频、备份和日志文件。它是开源的,基于 Go 语言开发,具有高度可扩展性和高可用性,能够在私有云、公有云和边缘环境中部署…

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目,导入源码 (1)找到项目的地址C:\Users\zzz\IdeaProjects\datasys,然后右击用idea编辑器打开。 (2)idea中上菜单栏打开open,然后输入file,选择源代码文件 2.…

LabVIEW放大器自动测量系统

开发了一个基于LabVIEW平台的多路前置放大器自动测量系统的开发与实施。该系统集成了硬件控制与软件编程,能够实现放大器各项性能指标的快速自动测量,有效提高了测试的精确性和效率。系统设计采用了虚拟仪器技术,结合了先进的测量与控制策略&…

.net core 外观者设计模式 实现,多种支付选择

1&#xff0c;接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2&#xff0c;实现接口 实现阿里支付 public class AliPagePay : IWe…

Linux的TERM环境变量

程序或者脚本驱动登录到Linux系统之后。执行命令或者脚本&#xff0c;其返回值中往往出现格式异常。原因则在于虚拟终端类型的高级特性&#xff0c;例如&#xff1a;“颜色、高亮、移动光标”等。那么&#xff0c;是否禁掉这些高级特性呢&#xff1f;可以选择dumb类型&#xff…

丹东纵横文化传媒:创新引领,广告服务再升级

近日,丹东市振兴区的丹东纵横文化传媒有限公司再次传来振奋人心的消息,这家以互联网和相关服务为主的新兴企业,在广告设计与传播领域实现了重大突破,进一步巩固了其在行业内的领先地位。 【广告服务全面升级,引领市场新风尚】 据丹东纵横文化传媒有限公司最新发布的信息显示,公…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

spine to unity-2.利用边缘框实现实时碰撞检测

主要讲spine的边缘框&#xff0c;在unity中&#xff0c;实现实时碰撞检测。其中使用的素材&#xff0c;是我为独立游戏ink制作的动画。独立游戏ink的开发日志&#xff0c;在小红薯持续更新中。spine工具包的安装&#xff0c;下载请参考spine to unity-1spine BoundingBoxFollow…

Doris全方位教程+应用实例

Impala性能稍领先于presto,但是presto在数据源支持上非常丰富&#xff0c;包括hive、图数据库、传统关系型数据库、Redis等 缺点&#xff1a;这两种对hbase支持的都不好&#xff0c;presto 不支持&#xff0c;但是对hdfs、hive兼容性很好&#xff0c;其实这也是顺理成章的&…

mac怎样清理photoshop垃圾的方法 ps清理缓存和垃圾 苹果电脑暂存盘已满怎么清理

很多使用过ps&#xff0c;尤其是Adobe全家桶的小伙伴会发现&#xff0c;这些软件占用缓存很多&#xff0c;而且随着使用时间的增长&#xff0c;缓存也会越多&#xff0c;并不会自动清理。那么mac系统怎么清理ps暂存盘呢&#xff1f;mac又该怎么最高效清理磁盘空间呢&#xff1f…

Linux嵌入书学习—数据结构——栈(seqstak)

一、栈&#xff1b; 定义&#xff1a; 是限定仅在表尾&#xff08;栈顶&#xff09;进行插入和删除操作的线性表 栈又称为 后进先出&#xff08;Last In First Out&#xff09; 的线性表&#xff0c;简称 LIFO 结构 栈顶&#xff08;Top&#xff09; 栈顶是栈中允许进行添加&…

RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习_2_登录

文章目录 一、登录1.生成验证码2.验证码作用1.大体流程2.代码层面(我们都是从前端开始看起) 一、登录 1.生成验证码 基本思路&#xff1a; 后端生成一个表达式&#xff0c;例如34?7,显而易见后面是答案截取出来题干和答案把题干11&#xff1f;变成图片&#xff0c;变成流&a…

[C++进阶]多态的概念、定义与实现

多态&#xff0c;顾名思义&#xff0c;即多种形态。具体来说&#xff0c;就是不同对象执行同一行为而产生不同的结果。 一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生…

神经网络与注意力机制的权重学习对比:公式探索

神经网络与注意力机制的权重学习对比&#xff1a;公式探索 注意力机制与神经网络权重学习的核心差异 在探讨神经网络与注意力机制的权重学习时&#xff0c;一个核心差异在于它们如何处理输入数据的权重。神经网络通常通过反向传播算法学习权重&#xff0c;而注意力机制则通过学…

LLMs之Llama 3.1:Llama 3.1的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama 3.1&#xff1a;Llama 3.1的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年7月23日&#xff0c;Meta重磅推出Llama 3.1。本篇文章主要提到了Meta推出的Llama 3.1自然语言生成模型。 背景和痛点 >> 过去开源的大型语言模型在能力和性能上一…

Kylin Cube构建日志分析:洞察大数据构建过程的窗口

Kylin Cube构建日志分析&#xff1a;洞察大数据构建过程的窗口 Apache Kylin是一款为Hadoop优化的开源分布式分析引擎&#xff0c;它通过构建数据立方体&#xff08;Cube&#xff09;来实现对大数据的快速查询。在维护和优化Cube的过程中&#xff0c;构建日志分析是一个重要的…