首页 > 其他分享 >48.DRF版本控制

48.DRF版本控制

时间:2023-01-03 13:56:34浏览次数:35  
标签:版本控制 48 v1 v2 version 版本 DRF

版本控制

版本控制是前后端分离开发一个非常重要的内容,比如说我们重要服务修改、升级等发生版本变化v1、v2、v3等,但是版本发生了变化比如 v1升级到了v2版本,v1版本还有业务在继续使用,相当于同时多个版本接口共存使用  

DRF版本控制配置

DRF中的版本控制默认是不开启的,request.version返回None,当开启API版本控制后,request.version属性中将包含与当前版本相对于的字符串
#settings
#DRF的版本类都位于versioning模块中
REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.AcceptHeaderVersioning" #指定版本控制的类,如果不指定则默认是None
    
    # 以下三项同样可以在自定义版本类中使用类属性置顶局部字段
    'DEFAULT_VERSION': 'v1',  # 默认版本号
    'ALLOWED_VERSIONS': ['v1','v2','v3'],  # 有效版本,可以设置字典
    'VERSION_PARAM': 'version',  # 版本的参数值
}
''' 
如果在单独为视图设置局部的版本类
使用version_class  =  来指定

'''

DRF中所有的版本控制类

BaseVersioning

版本控制基类,用于后面继承,与权限、限流等基类效果类似

AcceptHeaderVersioning

该类要求前端将版本放在Accept请求头中 配置版本控制之后,我们在视图中打印一下version,图1接口请求参数没有传入对应信息,所以是None,图2传入版本v1,打印结果是v1 我们可以通过不同的版本改变对请求的行为,比如如果是v1版怎么序列化,v2版本怎么序列化
def get_serializer_class(self):
    if self.request.version == 'v1':
        ...
    else:
        ...

URLPathVersioning

该类要求将版本作为URL路径的一部分 url conf中必须包含一个使用version关键字参数的匹配模式,路由可以获取对应的值,也就是版本信息
urlpatterns = [ re_path(r'^(?P<version>(v1|v2))/Category/$',CategoryViewSet), ]

NamespaceVersioning

该类与URLPathVersioning相同,区别在于是在django应用程序中配置的,使用url conf中的明面空间 而不是url conf 中的关键字参数 request.version 属性是根据与传入请求的路径匹配的 namespace 确定的
urlpatterns = [
    re_path(r'^v1/category/',CategoryViewSet , namespace='v1')),
    re_path(r'^v2/category/', CategoryViewSet, namespace='v2'))
]

HostNameVersioning

该类通过主机名控制版本方案,需要客户端将请求的版本指定为URL中主机名的一部分
# 使用该方案主机名需要与下面正则匹配
^([a-zA-Z0-9]+)\.[a-zA-Z0-9]+\.[a-zA-Z0-9]+$
# 示例 http://v1/0.0.0.0:1717/category/

QueryParameterVersioning

该类是在 URL 中包含版本信息作为查询参数的方式
#示例
http://0.0.0.0:1717/category/?version=v1  

自定义版本方案

自定义版本方案需要继承BaseVersioning类并重写determine_version方法
class TestVersion(versioning.BaseVersioning):
   
    def determine_version(self, request, *args, **kwargs):
        version = request.META.get('HTTP_TESTVERSION') #通过testversion字段指定版本
        if version is None: #判断version如果为None就会设置成默认的版本
            version = self.default_version

        if not self.is_allowed_version(version):#对版本号进行限制allowed_version,在settings中定义ALLOWD_VERSION=[V1,V2]
            
            raise exceptions.NotFound(self.invalid_version_message)
        return version
 

标签:版本控制,48,v1,v2,version,版本,DRF
From: https://www.cnblogs.com/Mickey-7/p/17021856.html

相关文章

  • Django-drf-序列化器高级用法之SerializerMethodField
    在Drf框架中的serializers.py序列化中,SerializerMethodField字段是一个只读字段。它通过调用附加到的序列化程序类上的方法来获取其值。它可用于将任何类型的数据添加到对......
  • 48个音标对应的字母
    原文网址:https://zhuanlan.zhihu.com/p/541971023康之源海参1元音:[i:]字母组合eeeaeie[i]发音字母iye[æ]发音字母a[e]字母组合eaea[ə:]字......
  • drf快速使用 CBV源码分析 drf之APIView分析 drf之Request对象分析
    目录序列化和反序列化drf介绍和安装使用原生django写接口djangoDRF安装drf快速使用模型序列化类视图路由datagrip使用postman测试接口CBV源码分析drf之APIView分析View类......
  • Idea使用gitee进行版本控制
    下载安装gitidea中进行git配置File->settings->VersionControl->gitPlugins下载安装gitee添加gitee账户创建gitee仓库,复制仓库地址创建java项目,在java项目的基础上......
  • 适合编程初学者的开源项目:小游戏2048(安卓版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。安卓版效果图技术特点安卓Kotlin工程截图开源地址https://gitee.com/lblbc/game_2048关于厦门......
  • 【归并排序】【链表】LeetCode 148. 排序链表
    题目链接148.排序链表思想分割cut环节:找到当前链表中点,并从中点将链表断开(以便在下次递归cut时,链表片段拥有正确边界)我们使用fast,slow快慢双指针法,奇数个......
  • 【CF1481F】AB Tree(单调队列优化多重背包)
    容易看出答案下界是树的最大深度,且构造方法只能是每一层的节点都染成同种颜色,可行性的判断是个背包问题。然后发现若不可行,就把除最后一层外的其它层每层都染成同种颜色,然......
  • AcWing 4818.奶牛大学 题解
    形式化题意给定一个整数\(N\)和一个序列\(c\)(\(|c|=N\)),试找出一个最小的\(x\),使得\(f(x)=(\sum\limits_{i=1}^{N}c_i>=x)\timesx\)的值最大大概思路由于\(......
  • Selenium48-实现添加赛区无效用例
    添加赛区_007总体流程鼠标悬停在赛区名称文本框检查出现浮动提示“该输入项为必输项”滚动条滑动到底部提交后检查提示不能为空无效数据时取消添加滚动条滑动到顶......
  • CF489B 1200 *
    题意解析如果对于一个a数列中的一个最小的数a[x],它可能和多个在b数列的数相匹配,显然,我需要先试试b数列中最小的一个b[y],如果可行,那么赶紧配对,再试试a数列中第......