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认证,权限,限流,流程
文章图片
局部设置认证 DRF认证,权限,限流,流程
文章图片
全局设置认证 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限流(频率)流程:
频率组件原理

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是关于限流的
DRF认证,权限,限流,流程
文章图片
限流局部使用 DRF认证,权限,限流,流程
文章图片
限流全局使用 版本:
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认证,权限,限流,流程
文章图片
DRF内置的解析器FormParser,JSONParser

    推荐阅读