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非常不戳。
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3pasgjkn988c
评论区