DRF-版本管理
常用的3种类
- QueryParameterVersioning (将版本信息以URL参数的形式传递)
- URLPathVersioning (将版本信息以URL路径形式传递)
- AcceptHeaderVersioning (将版本信息以请求头的形式传递)
使用
# settings.py 配置
REST_FRAMEWORK = {
"VERSION_PARAM": "v", # 版本号的参数名,可以任意配置,不配置默认参数名为version
"DEFAULT_VERSION": "v1", # 默认的版本号,可以不配置
"ALLOWED_VERSIONS": ["v1", "v2", "v3"], # 可以配置仅支持的版本,如果版本不在这里,会抛出异常
# 全局配置
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning"
}
1.1 GET传参
1.2 URL传参
1.3 请求头传参
2. 反向生成URL
源码分析
源码执行流程:
源码精读
# 根据执行流程 我们从determine_version()开始分析
def determine_version(self, request, *args, **kwargs):
# 读取是否有versioning_class没有就返回空值
if self.versioning_class is None:
return (None, None)
# 实例化对象
scheme = self.versioning_class()
# 返回一个元组 ( 调用对象的determine_version()方法,对象 )
return (scheme.determine_version(request, *args, **kwargs), scheme)
# 当前的类(其他类相似)
class QueryParameterVersioning(BaseVersioning):
"""
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
"""
invalid_version_message = _('Invalid version in query parameter.')
def determine_version(self, request, *args, **kwargs):
# 获取URL中的版本信息
# self.version_param, self.default_version setting中配置的
version = request.query_params.get(self.version_param, self.default_version)
# 看is_allowed_version方法 但前类没有那就去父类找
if not self.is_allowed_version(version):
# is_allowed_version返回为False 那就抛出异常
raise exceptions.NotFound(self.invalid_version_message)
return version
......
class BaseVersioning:
def is_allowed_version(self, version):
if not self.allowed_versions:
return True
# 判断是否为空和是否是默认版本配置 或者 但前版本号是否在我们定义的类中
return ((version is not None and version == self.default_version) or
(version in self.allowed_versions))
......