使用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仅使用小型项目和不需要进行持久化记录限制条件的场景。

相关文章
|
11月前
|
JSON 数据安全/隐私保护 数据格式
python fastapi 入门教程,每个案例都使用postman进行测试写的接口
python fastapi 入门教程,每个案例都使用postman进行测试写的接口
|
存储 测试技术 数据安全/隐私保护
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
FastAPI(八十三)实战开发《在线课程学习系统》--注册接口单元测试
|
JSON 数据库 数据格式
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (下)
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (下)
|
JSON 数据格式
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (中)
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (中)
|
JSON 数据安全/隐私保护 数据格式
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (上)
FastAPI(六十三)实战开发《在线课程学习系统》梳理系统需要接口 (上)
|
测试技术 Python
FastAPI 学习之路(三十九)对开发接口进行测试
FastAPI 学习之路(三十九)对开发接口进行测试
FastAPI 学习之路(三十九)对开发接口进行测试
|
开发框架 JSON 数据库
FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
FastAPI 学习之路(十二)接口几个额外信息和额外数据类型
|
NoSQL 测试技术 Redis
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(下)
|
测试技术 数据安全/隐私保护
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十四)实战开发《在线课程学习系统》--接口测试(上)
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架
FastAPI(八十二)实战开发《在线课程学习系统》接口开发-- 课程上架下架