目 录CONTENT

文章目录

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

phyger
2022-06-16 / 0 评论 / 1 点赞 / 1,957 阅读 / 1,902 字 / 正在检测是否收录...

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

1

评论区