zoukankan      html  css  js  c++  java
  • 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版本')
    试图测试
  • 相关阅读:
    R安装程序包:ERROR: failed to lock directory ‘/usr/lib64/R/library’ for modifying
    clusterProfiler
    R 画图保存为文件
    网站支持https之一:https原理和SSL证书类型
    Https系列之一:https的简单介绍及SSL证书的生成
    What is the difference between a directory and a folder?
    漫画解读:通过造车来了解软件开发模式 DevOps
    Multicast delegate of type Func (with return value)?
    What are good ways to prevent SQL injection? [duplicate]
    SqlCommand.Prepare Method
  • 原文地址:https://www.cnblogs.com/wf123/p/9986192.html
Copyright © 2011-2022 走看看