网络异常,图片无法展示
|
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仅使用小型项目和不需要进行持久化记录限制条件的场景。