三大认证源码分析
认证组件
通过dispath方法,进入三大认证:
首先看一下请求模块,进入request
进入get_authenticators
方法
可以知道,请求模块二次封装request对象,包含解析模块,还将认证类们的对象存储在请求对象中。
进入三大认证
遍历一个个认证器,完成一个个认证类,每一个配置的认证类都要调用authenticate
方法完成认证。返回值是user和auth组成的元组。
权限组件
频率组件
通过dispatch方法 进入频率组件
然后看SimpleRateThrottle类,有allow_request和 wait 方法。SimpleRateThrottle继承BaseThrottle,BaseThrottle也有allow_request和 wait两个方法,但它没写,需要自己写。
所以我们继承SimpleRateThrottle类,它帮我们写了allow_request和 wait两个方法
# 可以直接在自定义频率类中配置rate,这就是要动源码了
rate = '3/min'
# 但是推荐在自定义频率类中配置scope属性,然后再在settings文件中设置scope
class MobileReateThrottle(SimpleRateThrottle):
scope = 'mobile'
def get_cache_key(self, request, view):
if not request.user.is_authenticated or not request.user.mobile:
return None # 匿名用户 没有电话号的用户都不限制
return self.cache_format % {
'scope': self.scope,
'ident': request.user.mobile
}
# settings文件
REST_FRAMEWORK = {
# 频率组件,频率类一般做局部配置,但是频率调节在settings中配置
'DEFAULT_THROTTLE_RATES': {
'user': '5/min', # 登录用户限制
'anon': '3/min', # 匿名用户限制,
'mobile': '1/min'
},
}
来到上面的__init__
方法中
回到allow_request
cache.set(key, value, exp) 设置过期缓存,exp设为0,代表缓存不过期
请求一次,将时间保存一次,保存在self.history中
根据请求时间形成的列表长度判断是否限次
进入wait方法