ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DRF版本控制

2019-03-27 12:54:34  阅读:239  来源: 互联网

标签:VERSION 版本控制 DEFAULT self request version versioning 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_parames.get("version",'v1')

        return version

  

 

 

标签:VERSION,版本控制,DEFAULT,self,request,version,versioning,DRF
来源: https://www.cnblogs.com/yingjp/p/10606698.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有