zoukankan      html  css  js  c++  java
  • DRF版本控制

    一:源码解读

         1:视图类继承了APIView类并调用as_view()

            --path('', views.VersionView.as_view()),

         2:调用父类Veiw的as_veiw()方法

        3:父类View类as_view()里面内嵌了view函数,并最后返回self.dispath方法。该方法APIView类有重写,倒数第二个

           4:APIView的dispatch 执行了 一个self.initial(request, *args, **kwargs)

    self.initial(request, *args, **kwargs)
    

      5:进入initial可以看到执行了self.determine_version

             --并且把值 分别附值给 request.version,request.versioning_scheme 属性(保存版本信息)

            # Determine the API version, if versioning is in use.
            '''
            执行了self.determine_version(request, *args, **kwargs)  返回一个长度为2的元祖
            '''
            version, scheme = self.determine_version(request, *args, **kwargs)
            request.version, request.versioning_scheme = version, scheme
    

      6:进入self.determine_version可以发现关键self.versioning_class的默认的值是什么

        7:查看versioning_class的值,可以看到以下一行代码。     

                versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

        8:进入api_settings我们可以看到几个值

        # Generic view behavior
        'DEFAULT_PAGINATION_CLASS': None,#默认为None
        # Versioning
        'DEFAULT_VERSION': None,    #默认版本号
        'ALLOWED_VERSIONS': None,   #默认有效版本,可以设置字典
        'VERSION_PARAM': 'version', #版本的参数值key
    

      9:我们可以在自己的文件中对这几个值进行覆盖和修改

           --其中rest_framework.versioning.QueryParameterVersioning

    REST_FRAMEWORK={
        'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
        # Versioning
        'DEFAULT_VERSION': 'v1',  # 默认版本号
        'ALLOWED_VERSIONS': ['v1','v2','v3'],  # 有效版本,可以设置字典
        'VERSION_PARAM': 'version',  # 版本的参数值
    
    }
    

      10:再看看QueryParameterVersioning

            --可以看到父类Baseversioning实现了对应的方法。这里就不看对应的源码,自己去看简单

        11:当然我们通过对源码的理解,可以自己定制对应的控制版本类。

          --settings配置

    REST_FRAMEWORK={
        'DEFAULT_VERSIONING_CLASS':'utils.version.Myversion',
        # Versioning
        'DEFAULT_VERSION': 'v1',  # 默认版本号
        'ALLOWED_VERSIONS': ['v1','v2','v3'],  # 有效版本,可以设置字典
        'VERSION_PARAM': 'version',  # 版本的参数值
    }
    

       --自定义版本类简单编写 一定要重写determine_version方法

    class  Myversion(object):
        def determine_version(self, request, *args, **kwargs):
    
            version = request.query_params.get("version",'v1')
    
            return version
    

      

     

  • 相关阅读:
    ZOJ
    CodeForces
    模板
    前门
    错误记录
    2021/1/10例会 academy of management journal 2014vol 57 No.2,484-514
    Day7下
    Day7上
    Day6 下(
    Day6上 括号匹配专项
  • 原文地址:https://www.cnblogs.com/yingjp/p/10606698.html
Copyright © 2011-2022 走看看