fastapi设置接口的连接频率和次数
起因
最近使用fastapi做了一个连接数据库的查询数据的api,结合前端做了一个查询看板,但是遇到一个问题,就是我如何保证这个接口的频率不是那么的高。降低数据库的检索压力。
解决思路
刚开始的想法是python做一个查询队列。因此看了python的很多多线程多进程的文章,但是我的python技术太菜了,我搞了两个星期没搞好,只学会了python的多线程多进程的子进程的通信。最后不用这个方法。
转折
我后来谷歌了一下关于这个fastapi的api的查询频率的设置。果然在StackOverflow上找到了如果限制fastapi的api的调用限制方法。
https://stackoverflow.com/questions/65491184/ratelimit-in-fastapi
按照里面的设置果然可以了。这个答案里面有两个方法,一个是python的slowapi
包,一个是fastapi-limiter
包。
虽然slowapi
的github的star比fastapi-limiter
包的star更多,但是我主观的使用了fastapi-limiter
包。实际上,更加建议使用slowapi
包
-
slowapi
的GitHub地址: https://github.com/laurentS/slowapi
-
fastapi-limiter
的GitHub地址: https://github.com/long2ice/fastapi-limiter
解决办法
slowapi
包解决办法
-
- 安装:
pip install slowapi
- 安装:
-
- 直接使用:
from fastapi import FastAPI
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
limiter = Limiter(key_func=get_remote_address)
app = FastAPI()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
@app.get("/home")
@limiter.limit("5/minute")
async def homepage(request: Request):
return PlainTextResponse("test")
@app.get("/mars")
@limiter.limit("5/minute")
async def homepage(request: Request, response: Response):
return {"key": "value"}
fastapi-limiter
包解决办法
-
- 安装:
pip install fastapi-limiter
- 安装:
-
- 安装
redis
- 安装
-
- 使用:
注意的是:fastapi-limiter
包在启用的时候,需要打开redis
。
import aioredis
import uvicorn
from fastapi import Depends, FastAPI
from fastapi_limiter import FastAPILimiter
from fastapi_limiter.depends import RateLimiter
app = FastAPI()
@app.on_event("startup")
async def startup():
redis = await aioredis.create_redis_pool("redis://localhost")
FastAPILimiter.init(redis)
@app.get("/", dependencies=[Depends(RateLimiter(times=2, seconds=5))])
async def index():
return {"msg": "Hello World"}
if __name__ == "__main__":
uvicorn.run("main:app", debug=True, reload=True)
最后
更多的细节,可以看我上方的链接。