对DRF的APIView执行流程的源码学习
跟着源码学习下DRF的APIView执行流程原理
一 入口函数as_view() 方法——入口
{width=90%}
说明:
一般通过urlconf中配置路由时,需绑定类视图的as_view()方法。注意必须以类名.as_view()形式调用,而不能实例化调用,因为@classonlymethod中重写了__get__内置方法进行限制。
{width=90%}
二 基类中的as_view()—–闭包,实例化类
{width=90%}
说明:
采用闭包形式,返回的视图取消了csrf验证,因此继承APIView中的所有类中的视图都不会在进行防跨域伪造请求验证。因此需要搭配上JWT。
三 核心方法dispatch—-反射处理请求
{width=90%}
说明:
1.DRF对Django原生的wsgi协议的request进行了二次封装,向下兼容,使得现在的request能访问原生的request对象,同时也封装了数据解析,以request.data形式表示(默认接受application/json格式),以往的django都是request.POST和request.get来获取基于请求头为application/x-www-form-urlencode格式的数据。
2.利用反射机制映射到同名的自定义的请求处理方法上,然后执行。
3.封装了处理异常的方法,Django的dispatch中是没有的。
4.dispatch中的*args,**kwargs
其实也就是经过路由匹配传过来的参数。
四 initial初始化—–认证,权限,频率检查
{width=90%}
五 finialize_response—–数据格式渲染,头部添加
{width=90%}
六 数据解析将数据封装到request.data
{width=90%}
{width=90%}
说明:
数据解析的封装是在二次封装request的对象实例化时候完成的,也就是在dispatch中调用了initialize_request()方法。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!