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

  

 

原文地址:https://www.cnblogs.com/yingjp/p/10606698.html