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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值