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张图片
局部设置认证
DRF认证,权限,限流,流程_第2张图片
全局设置认证

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认证,权限,限流,流程_第3张图片
权限局部使用
DRF认证,权限,限流,流程_第4张图片
全局设置权限

drf限流(频率)流程:

频率组件原理

DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定义的方法来实现。

当我们请求进来,走到我们频率组件的时候,DRF内部会有一个字典来记录访问者的IP,

以这个访问者的IP为key,value为一个列表,存放访问者每次访问的时间,

{  IP1: [第三次访问时间,第二次访问时间,第一次访问时间],}

把每次访问最新时间放入列表的最前面,记录这样一个数据结构后,通过什么方式限流呢~~

如果我们设置的是10秒内只能访问5次,

  -- 1,判断访问者的IP是否在这个请求IP的字典里

  -- 2,保证这个列表里都是最近10秒内的访问的时间

      判断当前请求时间和列表里最早的(也就是最后的一个的)请求时间的差

      如果差大于10秒,说明请求已经不是最近10秒内的,删除掉,

      继续判断倒数第二个,直到差值小于10秒

  -- 3,判断列表的长度(即访问次数),是否大于我们设置的5次,

      如果大于就限流,否则放行,并把时间放入列表的最前面。


限流(频率)流程:

1.首先执行dispatch方法

2.重新封装Request

3.initial(request)方法里面有各种封装函数, 其中check_throttles是关于限流的

DRF认证,权限,限流,流程_第5张图片
限流局部使用
DRF认证,权限,限流,流程_第6张图片
限流全局使用

版本:

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认证,权限,限流,流程_第7张图片

DRF内置的解析器FormParser,JSONParser

你可能感兴趣的:(DRF认证,权限,限流,流程)