Flask全局限流首选flask-limiter:安装pip install flask-limiter后,必须显式指定key_func(如处理X-Forwarded-For防代理穿透)和storage_uri(如redis://localhost:6379),rate string须严格为小写单位加空格(如"10 per minute"),否则限流失效。

Flask 全局限流用 flask-limiter 最省事
直接上结论:别自己手写计数器或 Redis 脚本,flask-limiter 是当前 Flask 生态最成熟、最轻量的限流方案,支持内存、Redis、Memcached 等后端,且天然兼容装饰器和蓝图级配置。
它不是“可选”,而是事实标准——除非你有极特殊的策略(比如按用户角色动态配额),否则没必要绕开它。
安装只需:
pip install flask-limiter
初始化时必须指定 key_func 否则所有请求被当成同一客户端
默认情况下,Flask-Limiter 用 request.remote_addr 当 key,但如果你的应用跑在 Nginx / Cloudflare 后面,这个值会固定为反向代理 IP,导致全站被限成一个用户。
正确做法是显式定义 key_func,优先从 X-Forwarded-For 或 X-Real-IP 提取真实 IP:
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter = Limiter(
app,
key_func=lambda: request.headers.get("X-Forwarded-For", request.remote_addr)
)
注意:get_remote_address 不会自动处理代理头,必须自己取。如果用 Cloudflare,建议用 X-Forwarded-For.split(",")[0].strip() 防止伪造。
@limiter.limit 装饰器里单位必须写对,否则限流失效
常见错误是写成 "100 per day" 却没加空格,或大小写混用(如 "perDay")——flask-limiter 的解析器很严格,错一个字符就退化为无限制。
合法单位只有:second、minute、hour、day、month、year,全部小写,前面必须有空格:
-
"10 per minute"✅ -
"10/minute"❌(不识别斜杠语法) -
"10 perMinute"❌(大小写敏感) -
"100 per day"✅(注意空格)
全局限流直接加在 app 上即可:
limiter.limit("200 per day")(app)
Redis 后端要设 storage_uri,别只改 strategy
很多人以为把 strategy 设成 "moving-window" 就能用 Redis,结果发现还是走内存——因为没告诉 Limiter 去连哪台 Redis。
必须显式传 storage_uri:
limiter = Limiter(
app,
storage_uri="redis://localhost:6379",
strategy="moving-window"
)
另外注意:moving-window 比 fixed-window 更准但稍慢;如果只是防爬虫,fixed-window 足够,且对 Redis 压力更小。
没装 Redis?先用 storage_uri="memory://" 测试逻辑,上线前再切。
真正麻烦的从来不是配限流,而是怎么定义“同一个用户”:IP 不可靠、Session 不跨请求、JWT 又要验签。多数场景下,组合 X-Forwarded-For + 用户登录态(如有)+ UA 指纹才是平衡点,但得自己写 key_func。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











