如何在 FastAPI 中使用 SlowAPI 统一配置全局速率限制

酷宇大大_7566

酷宇大大_7566

2026-10-27

198人浏览

原创

如何在 FastAPI 中使用 SlowAPI 统一配置全局速率限制

本文介绍如何借助 SlowAPI 的 SlowAPIMiddleware 为 FastAPI 所有路由自动应用统一的默认速率限制,无需逐个装饰器手动添加,并支持按需豁免特定接口及未来扩展(如基于用户角色的差异化限流)。

本文介绍如何借助 slowapi 的 `slowapimiddleware` 为 fastapi 所有路由自动应用统一的默认速率限制,无需逐个装饰器手动添加,并支持按需豁免特定接口及未来扩展(如基于用户角色的差异化限流)。

在构建高可用 API 服务时,防止滥用和保障系统稳定性至关重要。SlowAPI 是专为 FastAPI 设计的轻量级限流库,支持内存存储(无需 Redis),开箱即用。与其为每个 @app.get()、@app.post() 等路由重复添加 @limiter.limit("5/minute"),更优雅的方式是声明式地设置全局默认限流策略——这正是 SlowAPIMiddleware 的核心价值。

✅ 正确做法:启用全局中间件 + 默认限流

只需三步即可完成全局限流配置:

  1. 初始化 Limiter 并指定 default_limits(如 "1/minute");
  2. 将 limiter 挂载到 app.state,供中间件识别;
  3. 注册 SlowAPIMiddleware 和 RateLimitExceeded 异常处理器。

完整示例代码如下:

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

# 1. 创建限流器,设置全局默认规则(所有路由均受此约束)
limiter = Limiter(
    key_func=get_remote_address,  # 按客户端 IP 限流
    default_limits=["1/minute"]     # 每分钟最多 1 次请求
)

app = FastAPI(title="Global Rate Limited API")

# 2. 必须挂载到 app.state.limiter,否则中间件无法工作
app.state.limiter = limiter

# 3. 注册异常处理器与中间件
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
app.add_middleware(SlowAPIMiddleware)

# 示例路由 —— 自动受全局限流保护
@app.get("/")
async def home():
    return {"message": "You're rate-limited to 1 request per minute."}

@app.get("/health")
async def health():
    return {"status": "ok"}

✅ 此配置下,所有未显式豁免的路由均自动应用 1/minute 限流,无需任何装饰器。

? 如何豁免特定路由?

若某些接口(如健康检查 /health 或公开静态资源)不应受限,可使用 @limiter.exempt 装饰器:

FastAPI Flask Proxy
FastAPI Flask Proxy

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

下载
@app.get("/unlimited")
@limiter.exempt  # ✅ 完全跳过限流检查
async def unlimited_endpoint():
    return {"message": "No limits applied here."}

⚠️ 注意:确保使用 SlowAPI ≥ 0.1.9(v0.1.9+ 已修复 async def 支持问题)。旧版本中该装饰器对 async def 路由可能失效。

? 进阶:按用户身份动态限流(如免费/付费)

虽然 default_limits 是静态的,但 SlowAPI 支持基于请求上下文的动态键函数。你可以扩展 key_func 实现差异化限流,例如结合 request.state.user 或 JWT 解析结果:

def dynamic_key_func(request: Request) -> str:
    # 假设已通过中间件将用户信息注入 request.state.user
    user = getattr(request.state, "user", None)
    plan = user.plan if user else "free"
    ip = get_remote_address(request)
    return f"{ip}:{plan}"  # 不同 plan 使用独立计数器

limiter = Limiter(
    key_func=dynamic_key_func,
    default_limits=["10/minute"],  # 免费用户默认
    application_limits=["100/minute"]  # 可选:应用级兜底(需手动调用 limiter.limit)
)

再配合自定义依赖项解析用户权限,即可实现「免费用户 10 次/分钟,付费用户 100 次/分钟」的灵活策略。

✅ 总结

  • ✅ 使用 SlowAPIMiddleware + default_limits 是实现全局限流的标准、推荐方式;
  • ✅ @limiter.exempt 可精准豁免任意路由(请升级至最新 SlowAPI 版本);
  • ✅ 通过自定义 key_func,可轻松接入用户身份、API Key、订阅等级等业务维度;
  • ❌ 避免自行在 @app.middleware 中重复实现限流逻辑——不仅易出错,还会绕过 SlowAPI 的统计、日志与异常标准化机制。

全局限流不是“加一道防火墙”,而是以声明式方式建立 API 的健康契约。从今天起,让每一秒的请求都值得被计量。

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

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

656

23

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

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

2026.06.16

539

12

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

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

2026.10.22

80

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

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastAPI SQL数据库实战文档
FastAPI SQL数据库实战文档

共0课时 | 0人学习

FastAPI官方教程文档
FastAPI官方教程文档

共0课时 | 0人学习