使用slowapi对FastApi的接口进行限速

简介: 使用slowapi对FastApi的接口进行限速

网络异常,图片无法展示
|



1、前言


前面,我们已经介绍过使用Redis来对FastApi的接口进行限速。但实际中,有很多种方式都可以对FastApi接口进行限速,今天我们就一起来学习如何使用slowapi对接口进行限速。


2、快速开始


slowapi仍然处于alpha阶段。

slowapi的计数器默认保存在内存中。

slowapi是从flask-limiter修改而来。


2.1、安装


pip install slowapi
复制代码


2.2、demo


from fastapi import FastAPI
from fastapi.requests import Request
from slowapi.errors import RateLimitExceeded
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
import uvicorn
app = FastAPI()
# 实例化一个limiter对象,根据客户端地址进行限速
limiter = Limiter(key_func=get_remote_address)
# 指定FastApi的限速器为limiter
app.state.limiter = limiter
# 指定FastApi的异常拦截器
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.get("/")
@limiter.limit("5/minute")
async def index(request: Request):  # 注意,这里的request必须得带,这是slowapi已知的问题,如果没有request,slowapi将无法拦截限速。
    return "welcome baby!"
复制代码


在视图函数中,request参数必须得带,这是slowapi已知的问题,如果没有request,slowapi将无法拦截限速。


以上代码的限速规则@limiter.limit("5/minute")含义为:每分钟限制访问5次。

测试过程:


 15/06/2022   19:12.28   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:12:54     2022
"welcome baby!"                                                                                                                                        ✔
  15/06/2022   19:12.55   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:12:58     2022
"welcome baby!"                                                                                                                                        ✔
  15/06/2022   19:12.58   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:13:00     2022
"welcome baby!"                                                                                                                                        ✔
  15/06/2022   19:13.01   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:13:02     2022
"welcome baby!"                                                                                                                                        ✔
  15/06/2022   19:13.03   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:13:04     2022
"welcome baby!"                                                                                                                                        ✔
  15/06/2022   19:13.05   /home/mobaxterm  date && curl localhost:8000
Wed Jun 15 18:13:07     2022
{"error":"Rate limit exceeded: 5 per 1 minute"}  
复制代码


以上,当在对接口进行5次调用后,limiter已经进行接口访问限制,并且返回了友好的提示。


而且后端日志也有比较清晰的提示。


INFO:  127.0.0.1:63299 - "GET / HTTP/1.1" 429 Too Many Requests
复制代码


不得不说,slowapi非常不戳。


3、注意


因为slowapi使用内存进行限速的阻拦,在大规模的环境或者生产环境中不建议使用。因为内存有限,而且使用场景有限制,在某些需要持久化的场景,这种方式就不适用了。比如,某个接口每个用户仅能调用一次且需要永久记录,这种场景下就需要选择其他方式了。所以slowapi仅使用小型项目和不需要进行持久化记录限制条件的场景。

相关文章
|
5月前
|
网络协议 Go
关于fastapi异步接口卡死的坑及解决
开发任务是使用fastapi去写一个对工业设备(PLC)的通信接口,方便其他后端服务与设备对接,将设备的功能抽象出来供MES调用。 通信协议是使用modbus TCP,由于fastapi是异步框架,很多以前在同步函数里开发的代码移植过来发现出现了异常,这也是不断踩坑的过程,问题解决之后也能体会到异步框架的优美与高效。
|
5月前
|
API Python
在线问诊 Python、FastAPI、Neo4j — 提供咨询接口服务
在线问诊 Python、FastAPI、Neo4j — 提供咨询接口服务
44 0
|
JSON API 数据格式
使用(Python)FastAPI快速构建你的后端接口服务
使用(Python)FastAPI快速构建你的后端接口服务
1108 0
|
JSON 数据安全/隐私保护 数据格式
python fastapi 入门教程,每个案例都使用postman进行测试写的接口
python fastapi 入门教程,每个案例都使用postman进行测试写的接口
|
网络安全 Windows
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
基于fastapi实现6个接口(token拦截, 2个业务流程,接口参数依赖校验)已经通过postman测试,记录部署服务器和windows,用于pytest接口自动化框架的接口测试对象
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
|
存储 测试技术 数据安全/隐私保护
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
|
测试技术 数据安全/隐私保护
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
|
NoSQL Redis 数据库
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞
FastAPI(八十一)实战开发《在线课程学习系统》接口开发-- 推荐课程列表与课程点赞