Django(61)认证组件源码分析
认证组件源码入口
APIView
下的dispatch
下的self.initial(request, *args, **kwargs)
,源码如下:
def initial(self, request, *args, **kwargs):
"""
在调用方法处理程序之前运行任何需要发生的事情
"""
# 获取请求的后缀格式
self.format_kwarg = self.get_format_suffix(**kwargs)
# 确定使用哪种渲染器和媒体类型来渲染响应,并存储
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg
# 如果正在使用版本控制,则确定 API 版本。
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
# 3大认证,确保传入请求被允许
self.perform_authentication(request)
self.check_permissions(request)
self.check_throttles(request)
三大认证
认证组件
self.perform_authentication(request)
认证组件作用:校验用户 - 游客
、合法用户
、非法用户
- 游客:代表校验通过,直接进入下一步校验(权限校验)
- 合法用户:代表校验通过,将用户存储在
request.user
中,再进入下一步校验(权限校验) - 非法用户:代表校验失败,抛出异常,返回
403
权限异常结果
权限组件
self.check_permissions(request)
权限组件:校验用户权限 - 必须登录
、所有用户
、登录读写游客只读
、自定义用户角色
- 认证通过:可以进入下一步校验(频率认证)
- 认证失败:抛出异常,返回
403
权限异常结果
频率组件
self.check_throttles(request)
频率组件:限制视图接口被访问的频率次数
- 限制的条件(IP、id、唯一键)
、频率周期时间(s、m、h)
、频率的次数(3/s)
没有达到限次:正常访问接口
达到限次:限制时间内不能访问,限制时间达到后,可以重新访问