DRF-版本管理

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))
    ......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值