SlowAPI 限流库使用指南与实战示例
概述
SlowAPI 是一个基于 Starlette 和 FastAPI 的轻量级限流库,它提供了简单易用的 API 请求速率限制功能。本文将深入介绍 SlowAPI 的核心功能和使用方法,帮助开发者快速掌握这一工具。
基础配置
全局默认限流设置
最基本的配置是为所有路由设置全局默认限流规则:
from starlette.applications import Starlette
from slowapi import Limiter, _rate_limit_exceeded_handler
from slowapi.util import get_remote_address
from slowapi.middleware import SlowAPIMiddleware
from slowapi.errors import RateLimitExceeded
# 初始化限流器,使用客户端IP作为标识,默认限制每分钟1次
limiter = Limiter(key_func=get_remote_address, default_limits=["1/minute"])
app = Starlette()
app.state.limiter = limiter
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
app.add_middleware(SlowAPIMiddleware)
# 这个路由将受到默认限流规则限制
async def homepage(request: Request):
return PlainTextResponse("每分钟只能访问一次")
app.add_route("/home", homepage)
在这个配置中,get_remote_address 是一个实用函数,用于获取客户端IP地址作为限流标识。
高级功能
路由豁免机制
某些特殊路由可能需要豁免限流规则:
@app.route("/someroute")
@limiter.exempt
def t(request: Request):
return PlainTextResponse("这个路由不受限流限制")
动态启用/禁用限流
在测试或特殊情况下,可能需要完全禁用限流功能:
# 初始化时禁用
limiter = Limiter(key_func=get_remote_address, enabled=False)
# 运行时动态切换
limiter.enabled = False # 禁用
limiter.enabled = True # 启用
存储后端配置
SlowAPI 支持多种存储后端,包括 Redis:
# 使用Redis作为存储后端
limiter = Limiter(
key_func=get_remote_address,
storage_uri="redis://<host>:<port>/n"
)
其中 /n 表示Redis数据库编号,使用默认数据库时可省略。
高级限流策略
自定义请求成本
除了简单的请求计数,SlowAPI 还支持基于请求特征的复杂限流策略:
def get_hit_cost(request: Request) -> int:
"""根据请求大小计算成本"""
return len(request)
@app.route("/someroute")
@limiter.limit("100/minute", cost=get_hit_cost)
def t(request: Request):
return PlainTextResponse("根据请求大小进行限流")
限流键生成策略
SlowAPI 提供了两种限流键生成方式:
-
URL模式 (
key_style="url"):- 使用完整URL作为限流键的一部分
- 不同参数被视为不同端点
- 示例键:
LIMITER/mock//some_route/my_param/1/1/minute
-
端点模式 (
key_style="endpoint"):- 使用视图函数名作为限流键
- 不同参数共享相同限流计数
- 示例键:
LIMITER/mock/{module}.my_func/1/1/minute
# 使用端点模式
limiter = Limiter(
key_func=lambda: "mock",
default_limits=["1/minute"],
key_style="endpoint"
)
中间件选择
SlowAPI 提供两种中间件实现:
-
WSGI中间件 (
SlowAPIMiddleware):- 基于 Starlette 的 BaseHTTPMiddleware
- 兼容性较好
-
ASGI中间件 (
SlowAPIASGIMiddleware):- 性能更优
- 支持异步异常处理
- 未来趋势
使用方式相同:
# 使用WSGI中间件
app.add_middleware(SlowAPIMiddleware)
# 或使用ASGI中间件
app.add_middleware(SlowAPIASGIMiddleware)
最佳实践
- 生产环境推荐使用 Redis 作为存储后端,确保限流状态持久化
- 对于API网关等场景,ASGI中间件是更好的选择
- 关键业务接口建议使用端点模式(key_style="endpoint"),避免参数变化导致限流失效
- 对于上传等特殊接口,可结合自定义成本函数实现更精细的限流控制
通过本文介绍的各种配置和策略,开发者可以根据实际业务需求灵活运用 SlowAPI 构建安全可靠的API限流系统。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



