Django Rest Framework 请求流程
2018-03-06 10:35
483 查看
用户请求到django,首先经过wsgi,中间件,然后到url路由系统,执行视图类中继承APIView执行as_view方法,在源码中可以看到VPIView继承了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
相关文章推荐
- Django底层剖析之一次请求到响应的整个流程
- [Django架构流程分析]请求处理机制其三:view层与模板解析
- Django REST framework教程二: 请求和响应
- django 框架请求相应流程
- Django REST FrameWork中文教程2:请求和响应
- Django底层剖析之一次请求到响应的整个流程
- Django的请求流程(url)
- Django-Rest framework基本流程
- django Rest Framework----APIView 执行流程 APIView 源码分析
- Django底层剖析之一次请求到响应的整个流程
- Django Rest Framework(请求)
- Django第一个请求的流程
- django源码解析一(请求处理流程)
- 循序渐进Python3(十三) --5-- django请求处理流程
- [Django架构流程分析]请求处理机制其一:进入Django前的准备
- [Django架构流程分析]请求处理机制其二:Django中间件的解析
- Django 之REST framework学习2:Requests and Responses(请求和相应)
- Django rest framework 的认证流程(源码分析)
- django rest framework之请求与响应(详解)
- [django]启动之后所有请求都是500错误