限流是防刷、防爬的第一道防线。最简单的「固定窗口」算法:
from collections import defaultdict, deque
import time
hits = defaultdict(deque)
def allow(key, limit=10, window=60):
now = time.time()
d = hits[key]
while d and d[0] < now - window:
d.popleft()
if len(d) >= limit:
return False
d.append(now)
return True
调用前 if not allow(ip): abort(429) 即可。缺点是窗口边界会有「双倍突发」,需要更平滑就换令牌桶。
我们论坛的防护模块(guard.py)就是在这个思路上做的,还加了自动封禁和验证码,感兴趣可以翻源码。
楼主 · 2026-09-27 23:24 · 浏览 256
· 编辑于 2026-09-27 23:24

