SlowAPI 限流库使用指南与实战示例

SlowAPI 限流库使用指南与实战示例

【免费下载链接】slowapi A rate limiter for Starlette and FastAPI 【免费下载链接】slowapi 项目地址: https://gitcode.com/gh_mirrors/sl/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 提供了两种限流键生成方式:

  1. URL模式 (key_style="url"):

    • 使用完整URL作为限流键的一部分
    • 不同参数被视为不同端点
    • 示例键:LIMITER/mock//some_route/my_param/1/1/minute
  2. 端点模式 (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 提供两种中间件实现:

  1. WSGI中间件 (SlowAPIMiddleware):

    • 基于 Starlette 的 BaseHTTPMiddleware
    • 兼容性较好
  2. ASGI中间件 (SlowAPIASGIMiddleware):

    • 性能更优
    • 支持异步异常处理
    • 未来趋势

使用方式相同:

# 使用WSGI中间件
app.add_middleware(SlowAPIMiddleware)

# 或使用ASGI中间件
app.add_middleware(SlowAPIASGIMiddleware)

最佳实践

  1. 生产环境推荐使用 Redis 作为存储后端,确保限流状态持久化
  2. 对于API网关等场景,ASGI中间件是更好的选择
  3. 关键业务接口建议使用端点模式(key_style="endpoint"),避免参数变化导致限流失效
  4. 对于上传等特殊接口,可结合自定义成本函数实现更精细的限流控制

通过本文介绍的各种配置和策略,开发者可以根据实际业务需求灵活运用 SlowAPI 构建安全可靠的API限流系统。

【免费下载链接】slowapi A rate limiter for Starlette and FastAPI 【免费下载链接】slowapi 项目地址: https://gitcode.com/gh_mirrors/sl/slowapi

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值