1、版本控制是干什么用的,为什么要有版本?
我们都知道每一个程序都是有版本的。而且版本也会升级从v1升级到v2、v3、v4·····,但是我们不可能因为新版本出现旧版本就不去维护,因为用户有权选择不更新版本。所以我们就需要对版本进行控制,这个DRF也给我们提供了一些封装好的方法。
2、在版本的源码中遨游
2.1 先看APIView中,有个initial方法
2.2 点击initial进入,我们可以看到将版本信息version 和 版本控制方案scheme 分别赋值给了request.version 和 request.determine_version.
self.determine_version 这个方法是找我们自己定义的版本控制类,没有的话就返回(None,None)
其实这个版本控制方案就是我们配置的版本控制的类,也就是说,APIView通过这个方法初始化了自己提供的组件
2.3 在rest_framework.versioning里查看版本控制类的方法。
3、具体用法
以URL上携带版本信息为例
3.1 第一步
先自定义一个版本控制类
class MyVersion(object): def determine_version(self, request, *args, **kwargs): version = request.query_params.get("version") if not version: version = 'v1' return version
3.2 第二部 在配置文件中注册
REST_FRAMEWORK = { # 这个是默认使用的版本控制类 "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion", # 这个版本控制类的路径。 # 默认使用的的版本 'DEFAULT_VERSION': 'v1', # 允许使用的版本 'ALLOWED_VERSIONS': ['v1','v2'], # 版本使用的参数名称 'VERSION_PARAM': 'version' }
3.3 在url中写路由
# 这个urls 总urls中的 urlpatterns = [ url(r'^version/', include('Version_Demo.urls')) # 这里用了路由分发 ] # 这个urls是Version_Demo的app中的 urlpatterns = [ url(r'^demo/', Version_Demo.as_view()), ]
3.4 试图测试
class Version_Demo(APIView): # 要继承APIView ,因为version是在APIView中的 def get(self, request): print(request.version) if request.version == 'v2': print(request.version) return Response('这是v2版本') return Response('这是v1版本')