simpleratethrottle生效需继承并定义scope,且settings.py中rest_framework['default_throttle_rates']必须包含对应键;多进程下须用redis等分布式缓存,否则locmem导致限流失效。

DRF的SimpleRateThrottle怎么配才真正生效
直接在视图或视图集上加throttle_classes = [SimpleRateThrottle]不会起作用——它缺少必须的get_rate()实现或scope配置,Django REST Framework会静默跳过限流。真正生效的前提是:继承并定义scope,且在settings.py中声明对应速率规则。
-
scope值(如'anon'、'user')必须和REST_FRAMEWORK['DEFAULT_THROTTLE_RATES']里的键完全一致,区分大小写 - 未登录用户走
anon,已登录用户走user,这是DRF内置逻辑,不能靠request.user.is_authenticated手动判断来覆盖 - 自定义
scope(如'upload')时,必须确保每个使用该限流类的视图都显式设置throttle_scope = 'upload',否则 fallback 到None导致失效
全局限流配置写在哪?settings.py里这三处不能少
全局限流不是只靠视图层控制,核心配置集中在REST_FRAMEWORK字典内,漏掉任意一项都会让限流“形同虚设”。
-
'DEFAULT_THROTTLE_CLASSES':填入自定义限流类路径,例如['myapp.throttles.AnonUserThrottle'];如果只写[<code>rest_framework.throttling.AnonRateThrottle],它依赖DEFAULT_THROTTLE_RATES['anon'],但该键若未定义,就完全不触发 -
'DEFAULT_THROTTLE_RATES':必须包含所有用到的scope键,格式为{'anon': '10/day', 'user': '100/hour'};单位支持/second、/minute、/hour、/day -
'THROTTLE_CLASSES'(非必需但推荐):仅当需要局部覆盖全局策略时才设,比如某个API要单独限为5/minute,此时需在视图中指定throttle_classes并配对应scope
为什么AnonRateThrottle对登录用户没反应?
因为AnonRateThrottle内部的get_cache_key()只对request.user.is_authenticated == False返回有效key,其余情况返回None,而DRF遇到None key直接跳过计数。这不是bug,是设计如此——它本就只管游客。
- 想同时限制登录/未登录用户,得在视图中并列配置两个类:
[AnonRateThrottle, UserRateThrottle] - 或者统一用自定义类,在
get_cache_key()里按需返回不同key,例如对user.id或request.META.get('REMOTE_ADDR')哈希 - 注意:多个限流类是“与”关系(全部通过才算过),不是“或”。一个被拒就直接返回
429
缓存后端影响限流行为?Redis和LocMem表现不一样
DRF限流依赖cache后端存储计数器,默认用default缓存。如果项目没配缓存,或default是LocMemCache,多进程部署时各worker会维护独立计数器,导致实际限流宽松甚至失效。
- 生产环境务必用Redis或Memcached,并确认
CACHES['default']['BACKEND']指向分布式缓存 - 测试时用
LocMemCache没问题,但启动多个gunicorn worker后,10/minute可能变成每个worker各自放行10次 - 可临时加日志验证:在自定义
SimpleRateThrottle子类的allow_request()里打点,看是否每次请求都命中同一缓存key
最易忽略的是scope和DEFAULT_THROTTLE_RATES键名的一致性,以及缓存后端在多worker下的隔离问题——这两点不检查,限流看起来配了,其实等于没设。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











