一、前言
通过DRF写的视图类,都会继承APIVIEW,而APIVIEW类继承VIEW,同时其重写了as_view方法【使之cbv能够url传参】,dispatch方法,重新封装了request对象,
将老的request对象赋值为_request,
前端传过来的所有数据给了:request.data
之前的request.GET封装成:request.query_params
二、版本控制是做什么用的, 我们为什么要用?
开发是有周期,及版本迭代的,新版本上线,老版本也不能直接拉下,需要进行维护
三、DRF版本控制源码分析
之前我们学视图的时候知道APIView,也知道APIView返回View中的view函数,然后调用的dispatch方法~
执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,那我们看下这个方法都做了什么~~
我们可以看到,我们的version版本信息赋值给了 request.version 版本控制方案赋值给了 request.versioning_scheme~~
从而之后我们在视图中就可以通过request通过点属性,操作版本信息了
其实这个版本控制方案~就是我们配置的版本控制的类~~
也就是说,APIView通过这个方法初始化自己提供的组件~~
DRF提供了5种版本控制类的方法:
导入模块:from rest_framework import versioning
scheme.determine_version的执行取决与我们所引用的版本控制类是哪一个
is_allowed_version方法
到这里我们获取到了具体访问的版本和控制版本的类
回到最开始
我们将version 和scheme封装在request中如果我们访问的版本符合要求我们可以通过调用
request.version, request.versioning_scheme 来获得版本号和控制版本的类
BaseVersioning所有版本控制类都要继承的基类
四、如何使用
a. 基于url的get传参方式(应用QueryParameterVersioning)
如:/users?version=v1
b. 基于url的正则方式
如:/v1/users/
这种方式传参url写法源码有说明(URLPathVersioning):
c. 基于 accept 请求头方式
如:Accept: application/json; version=1.0
基于版本控制类AcceptHeaderVersioning
d. 基于主机名方法
如:v1.example.com
引用的的版本控制类
e. 基于django路由系统的namespace
如:example.com/v1/users/
引用的版本控制类NamespaceVersioning