如何在 FastAPI 中使用 SlowAPI 为所有路由统一配置全局速率限制

浅辰姑娘_8779

浅辰姑娘_8779

2026-10-27

332人浏览

原创

如何在 FastAPI 中使用 SlowAPI 为所有路由统一配置全局速率限制

本文介绍如何通过 SlowAPI 的 SlowAPIMiddleware 为 FastAPI 应用设置全局默认速率限制,无需为每个路由手动添加装饰器,并支持按需豁免特定端点或扩展为基于用户角色的动态限流策略。

本文介绍如何通过 slowapi 的 `slowapimiddleware` 为 fastapi 应用设置全局默认速率限制,无需为每个路由手动添加装饰器,并支持按需豁免特定端点或扩展为基于用户角色的动态限流策略。

在构建高可用 API 服务时,合理的速率限制(Rate Limiting)是防止滥用、保障系统稳定性的关键一环。SlowAPI 作为专为 FastAPI 设计的限流库,不仅支持 Redis 等外部后端,也原生提供轻量级的内存(in-memory)限流能力——非常适合中小型项目或开发/测试环境。

最简洁高效的全局限流方式,不是手动编写中间件去调用 limiter 内部逻辑,也不是逐个装饰 endpoint,而是直接启用 SlowAPI 官方推荐的 SlowAPIMiddleware。该中间件会自动拦截所有 HTTP 请求,依据 Limiter 实例中配置的 default_limits 对未显式指定限流规则的路由统一生效。

以下是最小可行示例:

from fastapi import FastAPI, Request, Depends
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

# 初始化 Limiter,指定默认限流规则(如:1 次/分钟)
limiter = Limiter(
    key_func=get_remote_address,
    default_limits=["1/minute"]  # ✅ 全局默认规则:所有路由均受此限制
)

app = FastAPI()
app.state.limiter = limiter  # 必须绑定到 app.state,供中间件访问

# 注册异常处理器,返回标准 429 响应
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
# 启用 SlowAPI 中间件 —— 核心步骤
app.add_middleware(SlowAPIMiddleware)

@app.get("/")
async def home():
    return {"message": "You can call this once per minute"}

@app.get("/public")
@limiter.exempt  # ✅ 豁免特定路由(如公开健康检查接口)
async def public_endpoint():
    return {"status": "ok"}

✅ 关键点说明:

FastAPI Flask Proxy
FastAPI Flask Proxy

FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。

下载
  • default_limits 是全局兜底规则,对所有未显式调用 @limiter.limit(...) 的路由生效;
  • @limiter.exempt 可用于完全跳过限流(如 /health、/docs),自 SlowAPI v0.1.9+ 起已完整支持 async def 路由,请确保升级至最新版(pip install --upgrade slowapi);
  • get_remote_address 作为 key 函数,按客户端 IP 限流;你也可自定义 key(例如结合 JWT 用户 ID 或订阅等级)实现更精细控制。

进阶:基于用户身份的动态限流

若需根据用户权限(如 free/premium)差异化限流,可扩展 key_func 并在路由中注入用户上下文:

from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from jose import jwt

# 示例:从 token 解析用户类型
async def get_user_plan(request: Request) -> str:
    auth = HTTPBearer()
    try:
        credentials: HTTPAuthorizationCredentials = await auth(request)
        payload = jwt.decode(credentials.credentials, "secret", algorithms=["HS256"])
        return payload.get("plan", "free")  # e.g., "free" or "premium"
    except Exception:
        return "free"

# 自定义限流键:组合 IP + 订阅等级
def dynamic_key(request: Request):
    ip = get_remote_address(request)
    plan = request.state.plan if hasattr(request.state, "plan") else "free"
    return f"{ip}:{plan}"

# 在中间件中提前解析 plan 并存入 request.state(需配合依赖注入)
@app.middleware("http")
async def add_plan_to_request(request: Request, call_next):
    request.state.plan = await get_user_plan(request)
    return await call_next(request)

# 重新初始化 limiter,使用动态 key
limiter = Limiter(
    key_func=dynamic_key,
    default_limits={
        "free": "10/minute",
        "premium": "100/minute"
    }.__getitem__  # ⚠️ 注意:此处需配合自定义逻辑,实际建议用装饰器覆盖
)

但更推荐的做法是:保留全局默认值,对 premium 用户路由显式覆盖:

@app.get("/premium/data")
@limiter.limit("100/minute", key_func=get_remote_address)
async def premium_data():
    return {"data": "high-speed content"}

注意事项与最佳实践

  • ❗ SlowAPIMiddleware 依赖 app.state.limiter,务必在添加中间件前完成赋值;
  • ? 不要自行实现“手动中间件 + 调用 limiter.check()”,这会绕过 SlowAPI 的异常处理与响应格式化,且易出竞态问题;
  • ? 内存限流不适用于多进程部署(如 uvicorn --workers 4),此时必须使用 Redis 后端;
  • ? 生产环境建议搭配日志记录(如 logger.info(f"Rate limit hit for {key}"))和监控告警。

通过以上方式,你既能以声明式、低侵入的方式实现全站速率防护,又能灵活适配业务增长带来的分级限流需求。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

路由优化大师
路由优化大师

路由优化大师是一款及简单的路由器设置管理软件,其主要功能是一键设置优化路由、屏广告、防蹭网、路由器全面检测及高级设置等,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

路由 fastapi

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

2025.12.22

119

5

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

2026.02.06

554

18

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

2026.05.09

636

23

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

2026.06.16

539

12

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

60

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

40

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

40

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

20

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

40

25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Revel 官方开发手册
Revel 官方开发手册

共0课时 | 0人学习

Buffalo框架路由开发手册
Buffalo框架路由开发手册

共0课时 | 0人学习

Buffalo框架官方文档
Buffalo框架官方文档

共0课时 | 0人学习