⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

实现自适应滑动窗口限流算法

基于用户行为自适应调整速率限制,防止恶意访问但不影响正常用户。 · 难度:入门 · +10XP

自适应动态限流器

DRF内置限流使用固定窗口,本教程教你用Redis实现滑动窗口,并根据用户历史行为(如失败登录次数、请求间隔)动态调整阈值。例如:如果用户连续5次登录失败,则将其限流阈值从100次/分钟降为10次/分钟,恢复后逐渐回升。你将编写一个继承BaseThrottle的自定义类,重写allow_request和wait方法,并在其中计算动态权重。

from rest_framework.throttling import BaseThrottle
import redis

class AdaptiveThrottle(BaseThrottle): def __init__(self): self.redis = redis.Redis() self.base_rate = 100 # 默认每分钟100次 def allow_request(self, request, view): user_id = request.user.id current_window = int(time.time() // 60) key = f'throttle_{user_id}_{current_window}' count = self.redis.incr(key) self.redis.expire(key, 60) # 获取动态阈值 penalty = self.redis.get(f'penalty_{user_id}') or 0 dynamic_rate = self.base_rate - int(penalty) return count <= dynamic_rate def wait(self): return 30

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 189 篇
0 完成
🔥 0