对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()方法。