DRF 之 版本控制

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'
}
配置seting.py

  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()),
]
urls.py

  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版本')
试图测试
原文地址:https://www.cnblogs.com/wf123/p/9986192.html