版本控制

版本控制是前后端分离开发一个非常重要的内容,比如说我们重要服务修改、升级等发生版本变化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.DRF版本控制的更多相关文章

  1. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  2. $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制

    1  importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...

  3. 【DRF版本控制】

    目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 "首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版 ...

  4. Restful API学习Day4 - DRF版本控制和认证

    参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...

  5. drf版本控制 django缓存

    drf的版本控制 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersion ...

  6. DRF版本控制(源码分析)

    DRF中版本控制的五种情况(源码分析) 在restful规范中要去,后端的API中需要体现版本. drf框架中支持5种版本的设置. 1. URL的GET参数传递(*) 示例: user/?versio ...

  7. Restful framework【第十二篇】版本控制

    简单使用 -drf版本控制 -在setting中配置 'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS' ...

  8. 【DRF版本】

    目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了. 那么 ...

  9. Django REST Framework(DRF)_第三篇

    DRF版本控制 介绍 我们在看APIView源码时可以看到,版本和版本控制类是通过determine_version的返回值获取的 version, scheme = self.determine_v ...

  10. Python Django-入门到进阶

    web应用 Python-web应用 +HTTP协议 +web框架 第二篇:Djangon简介 Diango 框架起步 Python-Django基础 第三篇:路由控制 Python-Django 路 ...

随机推荐

  1. 如何使用 Helm 在 K8s 上集成 Prometheus 和 Grafana|Part 3

    在本教程的前两部分,我们分别了解和学习了Prometheus 和 Grafana 的基本概念和使用的前提条件,以及使用 Helm 在 Kubernetes 上安装 Prometheus. 在今天的教程 ...

  2. 2023年SWPU NSS 秋季招新赛 (校外赛道) MISC复盘WP

    GIF Code 题目描述: 扫一扫即可获取Flag 给了一个含二维码的动图,分离一下得到九张二维码碎片,根据文件名数字按顺序组装,在线扫码即可 NSSCTF{3f0ac91b-3e0e-a7e2-7 ...

  3. 为什么 sort() 中的 return a-b 可以决定升序

    arr.sort( function(a,b){ return a-b; } ) 千万不要理解成 a 减 b 其实它代表的是26个字母中的 a 和 b b 比 a 大,所以 a - b 就是升序,写成 ...

  4. [转帖]Kafka Dashboard

    https://grafana.com/grafana/dashboards/18276-kafka-dashboard/ Kafka resource usage and consumer lag ...

  5. [转帖]人人都应该知道的CPU缓存运行效率

    https://zhuanlan.zhihu.com/p/628017496 提到CPU性能,大部分同学想到的都是CPU利用率,这个指标确实应该首先被关注.但是除了利用率之外,还有很容易被人忽视的指标 ...

  6. 【转帖】SmartNIC — TSO、GSO、LRO、GRO 技术

    目录 文章目录 目录 TSO(TCP Segmentation Offload) GSO(Generic Segmentation Offload) LRO(Large Receive Offload ...

  7. [转帖]20191022-从Jenkins NativeOOM到Java8内存

    我把老掉牙的Jenkins升级了,它跑了几天好好的:后来我有一个python脚本使用JenkinsAPI 0.3.9每隔2.5分钟发送约300余get请求,结果过了3天,它就挂了:当我开两个脚本时,4 ...

  8. 查看dmesg 里面部分内容的精确时间

    for i in `dmesg |grep "stuck for" |awk '{print $1}' |awk -F "." '{print $1}' |aw ...

  9. 基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结

    基于Prometheus和Grafana监控redis,Oracle,mysql,pg以及sqlserver的方法总结 简单记录一下方法 1.获取相应的exporter 1. redis docker ...

  10. ThreadLocal源码解析及实战应用

    作者:京东物流 闫鹏勃 1 什么是ThreadLocal? ThreadLocal是一个关于创建线程局部变量的类. 通常情况下,我们创建的变量是可以被任何一个线程访问并修改的.而使用ThreadLoc ...