48.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
风月都好看,人间也浪漫.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)