DRF认证,权限,限流,流程
drf十大组件
认证权限(授权)用户访问次数/频率限制版本解析器(parser)
序列化分页路由系统视图渲染器
drf认证流程:
1.首先执行dispatch方法
2.重新封装Request
3.initial(request)方法里面有各种封装函数, 其中perform_authentication(request)是认证的函数, 返回一个request.user
4.def _authenticate():循环所有的authentication对象,执行authenticate方法
5.Authtication 自定义认证类
6.def authenticate():
自定义认证
-报错
-返回元组(request.user, request.auth)
文章图片
局部设置认证
文章图片
全局设置认证 drf权限流程:
1.首先执行dispatch方法
2.重新封装Request
3.initial(request)方法里面有各种封装函数, 其中check_permissions(request)是权限的函数
4. check_permissions中的has_permission()(要复写)就是权限函数(get_permissions循环所有权限类)
5. Permisson自定义权限类
has_permission自定义权限
True, 有权限
False, 无权限
其中message属性为没有权限返回的字符串
文章图片
权限局部使用
文章图片
全局设置权限 drf限流(频率)流程:
频率组件原理
DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定义的方法来实现。
当我们请求进来,走到我们频率组件的时候,DRF内部会有一个字典来记录访问者的IP,
以这个访问者的IP为key,value为一个列表,存放访问者每次访问的时间,
{IP1: [第三次访问时间,第二次访问时间,第一次访问时间],}
把每次访问最新时间放入列表的最前面,记录这样一个数据结构后,通过什么方式限流呢~~
【DRF认证,权限,限流,流程】如果我们设置的是10秒内只能访问5次,
-- 1,判断访问者的IP是否在这个请求IP的字典里
-- 2,保证这个列表里都是最近10秒内的访问的时间
判断当前请求时间和列表里最早的(也就是最后的一个的)请求时间的差
如果差大于10秒,说明请求已经不是最近10秒内的,删除掉,
继续判断倒数第二个,直到差值小于10秒
-- 3,判断列表的长度(即访问次数),是否大于我们设置的5次,
如果大于就限流,否则放行,并把时间放入列表的最前面。
限流(频率)流程:
1.首先执行dispatch方法
2.重新封装Request
3.initial(request)方法里面有各种封装函数, 其中check_throttles是关于限流的
文章图片
限流局部使用
文章图片
限流全局使用 版本:
1.和认证的流程一样,进入initial(request)
2.在认证,权限,节流前先执行了这两句函数,获取到version,scheme,并分别赋值给request对象的version, versioning_scheme属性
3.进入determine_version()函数
4.在这里获取到scheme就是api_settings.DEFAULT_VERSIONING_CLASS,系统默认版本控制类,那scheme.determine_version(request, *args,kwargs) 就是该类下的一个方法
5.查看rest_framework库的一个自带类中的determine_version方法, 返回的是版本号。于是version, scheme分别是版本号和一个版本控制类,并分别赋值给request对象的version, versioning_scheme属性。
文章图片
DRF内置的解析器FormParser,JSONParser
推荐阅读
- mysql中视图事务索引与权限管理
- 最新Mac系统安装fastlane|最新Mac系统安装fastlane /usr/bin 权限问题
- macOS系统上,安装包安装权限不足或验证不过问题
- 权限管理-linux常用命令大全[功能分类]
- cycript|cycript & 命令权限
- Android|Android 6.0动态申请权限
- 深入理解Kubernetes的认证与授权机制
- 深入理解linux文件权限|深入理解linux文件权限 SUID、SGID、SBIT
- 【认证】英国博赞思维导图管理师+Lily|【认证】英国博赞思维导图管理师+Lily Jiang+第五幅+物品准备清单:台湾行
- Linux系统网络编程|Linux系统(权限管理)