1.首先所有drf框架的源码基本都在APIView的dispatch方法中进入 2.三大认证是在self.initial(request, *args, **kwargs)点进去 3.在self.check_throttles(request) 进行频率认证
1.入口频率组件的入口
2.进入该方法,该方法在频率组件类中遍历出频率类
3.进入throttle组件的allow_request方法中
4.父类中没有写该方法,需要重写这个方法
5.进入拥有allow_request方法的子类
6.寻找rate。从第9步回来rate暂时还不知道是什么
7.在__init__中初始化定义了rate
8.该方法中定义了rate
9.由于没有scope肯定会报错,在后面几个示例的方法中发现我们需要提前定义scope,故我们假定scope=user,从配置中拿出key为user的值,此时我们还不知道值是什么
10.进入该方法,发现该方法需要重写,故我们以下方的UserRateThrottle类方法为例。从步骤12可知self.key是'throttle_user_1'
11.self.cache_format是'throttle_%(scope)s_%(ident)s'
12.我们假定pk为1,故return的是'throttle_%(scope)s_%(ident)s' =》 'throttle_user_1'
13.从django的缓存中拿出key为'throttle_user_1'的值赋值给self.history,self.now是当前时间
14.当缓存中拿出self.history,并且当最后一个值小于当前时间减去60(限制的频率时间)。从16可知
并且当小于时自动将最后一个值移除,如果缓存中的历史大于声明的次数3,就返回False,代表界面访问次数超过限制
否则就将当前时间插入self.history,再将'throttle_user_1'作为key,self.history作为值,self.duration作为有效时间存入缓存中,返回True,代表还可以继续访问
15.从该方法得知rate必定是(数字 + / + s,m,h,d开头的一个字符),猜测可知,应该是配置频率,如3/m,一分钟三次
16.如3/m,那么第一个就是3,第二个就是m对应的60
17.如果限制的频率是3/m,一分钟三次,
那么当第一次访问时,正常进入,将访问当前时间,过期时间放入缓存这种,
第二次来时判断是否频率内的时间,如果超过了就移除该访问记录,再判断访问记录是否超过限制,如果超过就返回False,否则True
如果在1分钟内超过四次时,返回False