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