Django Rest Framework 请求流程

共计 1253 个字符,预计需要花费 4 分钟才能阅读完成。


​ 用户请求到 django,首先经过 wsgi,中间件,然后到 url 路由系统,执行视图类中继承 APIView 执行 as_view 方 法,在源码中可以看到 APIView 继承了 django 的 View 类,通过 super 执行 View 中的 as_view 方法,最终返回执行self.dispatch(),按照 django 类中查找顺序现从自己的方法中找,如果自己没有 dispatch 方法再从继承的父类中找,从APIView 中找 dispatch 方法,在 dispatch 中首先将 request 执行 self.initialze_request 重新封装 request,之后执行self.initial 方法,这个方法一共执行4步操作:

1. 首先对request版本进行验证
版本控制执行自己类中的determine_version方法,最终是versioning_class的属性,可以通过在settings.py文件中进行配置
2. 进行用户认证
执行perform_authentication方法,在这个方法中执行了request.user方法,按照 python 类查找顺序先到 APIView 中进行查找,没有往 View 中查找都没有,往回看重新看一下之前的request封装操作,

查到 restframework.request 中有个 Request 类重新封装 request,在 Request 中查找 user 方法,最后找到request.user 最后返回 authentication_classes 实例化并返回认证列表
3. 进行权限控制
执行check_permissions方法,按照上面的执行的流程,最后返回permission_classes实例化并返回权限列表,然后循环实例化对象中has_permission(必须存在)方法进行判断,如果定义了权限类,

has_permission必须有返回值,可以返回布尔值或raise一个报错信息,True表示有权限不做操作,False没有权限执行permission_denied方法,首先进行判断是否进行认证,如果没有认证则raise一个没有认证错误信息,如果有认证则raise一个没有权限错误信息。
4. 进行用户访问频率控制
执行check_throttles方法,按照上面的执行的流程,最后返回throttle_classes实例化并节流列表,循环执行allow_request方法,源码中如果没有定义allow_request方法则restframework会返回raise错误必须重写allow_request方法,重写allow_request,比如对匿名用户访问做限制1分钟只能访问10次超过10次休息1分钟返回false不让访问,执行到wait(必须定义)进行重写,将访问时间进行计算然后返回下次访问时间,也可以继承restframework已经写好的类SimpleRateThrottle,AnonRateThrottle,UserRateThrottle,ScopedRateThrottle
正文完
 
Dustin
版权声明:本站原创文章,由 Dustin 2019-07-22发表,共计1253字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。