推荐答案
在 FastAPI 中,可以通过使用中间件(Middleware)来限制请求频率。以下是一个使用 slowapi 和 redis 来实现请求频率限制的示例:
// www.javascriptcn.com code example
from fastapi import FastAPI, Request, HTTPException
from slowapi import Limiter
from slowapi.util import get_remote_address
from slowapi.middleware import SlowAPIMiddleware
app = FastAPI()
# 初始化限流器
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_middleware(SlowAPIMiddleware)
# 设置默认的限流规则
@app.get("/limited-endpoint")
@limiter.limit("5/minute")
async def limited_endpoint(request: Request):
return {"message": "This endpoint is rate limited."}
# 启动应用
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)在这个示例中,slowapi 用于限制请求频率,get_remote_address 函数用于获取客户端的 IP 地址作为限流的依据。@limiter.limit("5/minute") 表示每分钟最多允许 5 次请求。
本题详细解读
1. 为什么需要限制请求频率?
限制请求频率是为了防止恶意用户或自动化脚本对服务器进行过度的请求,从而导致服务器资源耗尽或服务不可用。通过限制请求频率,可以有效地保护服务器资源,确保服务的稳定性和可用性。
2. 如何实现请求频率限制?
在 FastAPI 中,可以通过以下步骤实现请求频率限制:
安装依赖库:首先需要安装
slowapi和redis库。slowapi是一个用于 FastAPI 的限流库,而redis用于存储限流数据。pip install slowapi redis
初始化限流器:在 FastAPI 应用中初始化
Limiter,并设置key_func为get_remote_address,以便根据客户端的 IP 地址进行限流。添加中间件:通过
app.add_middleware(SlowAPIMiddleware)将限流中间件添加到应用中。设置限流规则:在需要限流的路由上使用
@limiter.limit("规则")装饰器来设置限流规则。例如,@limiter.limit("5/minute")表示每分钟最多允许 5 次请求。
3. 限流规则的格式
限流规则的格式通常为 "数量/时间单位",例如:
"5/minute":每分钟最多 5 次请求。"10/hour":每小时最多 10 次请求。"100/day":每天最多 100 次请求。
4. 使用 Redis 存储限流数据
slowapi 默认使用内存存储限流数据,但在生产环境中,建议使用 Redis 来存储限流数据,以便在多个实例之间共享限流状态。可以通过以下方式配置 Redis:
// www.javascriptcn.com code example from slowapi import Limiter from slowapi.util import get_remote_address from slowapi.middleware import SlowAPIMiddleware from slowapi.storage import RedisStorage import redis # 初始化 Redis 连接 redis_client = redis.Redis(host="localhost", port=6379, db=0) storage = RedisStorage(redis_client) # 初始化限流器 limiter = Limiter(key_func=get_remote_address, storage=storage)
通过这种方式,限流数据将存储在 Redis 中,确保多个 FastAPI 实例之间的限流状态一致。