主要从SimpleRateThrottle的allow_request方法开始分析

第一步
1.查看SimpleRateThrottle的allow_request
if self.rate is None:
return True
第二步
2.查看rate
def __init__(self):
if not getattr(self, 'rate', None):
self.rate = self.get_rate()
self.num_requests, self.duration = self.parse_rate(self.rate)
自己写的频率类里面没有这个rate 所以返回None,那么继续走下面的代码
第三步
3.查看 self.rate = self.get_rate()这里的get_rate
还是在SimpleRateThrottle里面
if not getattr(self, 'scope', None):
msg = ("You must set either `.scope` or `.rate` for '%s' throttle" %
self.__class__.__name__)
raise ImproperlyConfigured(msg)
try:
return self.THROTTLE_RATES[self.scope]
except KeyError:
msg = "No default throttle rate set for '%s' scope" % self.scope
raise ImproperlyConfigured(msg)
有的话就执行 return self.THROTTLE_RATES[self.scope]
第四步
4.查看 THROTTLE_RATES[self.scope]
THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES
这个是按照scope键去我们配置的文件字典取值里取V值
'throttling': '5/m' throttling就是我们自定义的scope的名字
第五步
5.查看parse_rate
def parse_rate(self, rate):
if rate is None:
return (None, None)
num, period = rate.split('/')
num_requests = int(num)
duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
return (num_requests, duration) 返回的就是 5,60
第六步
6.回到SimpleRateThrottle的allow_request的第二段代码
第一段就是我们第一步查看的 以上就是它的rate里面值的查找过程
现在的rate是有值的 那么会继续走下面的代码
self.key = self.get_cache_key(request, view)
if self.key is None:
return True
第七步
7.有值的话代码继续往下走
self.history = self.cache.get(self.key, [])
self.now = self.timer()
第八步
8.判断访问的频率
while self.history and self.history[-1] <= self.now - self.duration:
self.history.pop()
if len(self.history) >= self.num_requests:
return self.throttle_failure()
return self.throttle_success()
第九步
9. 第八步如果访问次数没有超出配置的次数 那么返回下面代码的内容
def throttle_success(self):
self.history.insert(0, self.now)
self.cache.set(self.key, self.history, self.duration)
return True
总结
'''总结 : 以后写频率类的时候继承SimpleRateThrottle
重写 get_cache_key方法 一定要写一个类属性 scope 配置文件一定要写
'''
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!