fastapi设置接口的连接次数和频率

fastapi设置接口的连接频率和次数

起因

最近使用fastapi做了一个连接数据库的查询数据的api,结合前端做了一个查询看板,但是遇到一个问题,就是我如何保证这个接口的频率不是那么的高。降低数据库的检索压力。
fastapi设置接口的连接次数和频率_第1张图片

解决思路

刚开始的想法是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

    1. slowapi的GitHub地址: https://github.com/laurentS/slowapi
    1. fastapi-limiter的GitHub地址: https://github.com/long2ice/fastapi-limiter

解决办法

slowapi包解决办法

    1. 安装:pip install slowapi
    1. 直接使用:
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包解决办法

    1. 安装: pip install fastapi-limiter
    1. 安装redis
    1. 使用:

注意的是: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)

最后

更多的细节,可以看我上方的链接。

你可能感兴趣的:(fastapi,python,python,fastapi,后端,数据看板)