8-1 版本-DRF版本
目录:
- 版本控制介绍
- 五种版本控制方案
- URLPathVersioning控制方法
- 类视图URLPathVersioning控制
一、版本控制介绍
API版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。DRF提供了许多不同的版本控制方案。可能会有一些客户端因为某些原因已经不再维护了,但是我们后端的接口还是要不断的更新迭代的,这个时候通过版本控制返回不同的内容就是一种不错的解决方案。
其实说白了,我访问的是同一个视图,但是由于不同的版本,返回的参数是不一样的。那这个是怎么控制的呐?来我们继续往下介绍。
二、五种版本控制方案
版本控制方案,一共有5种,那我们怎么知道这五种的呐?我们就需要,这个时候我们就需要导入BaseVersioning模块,好啦我们一起来看一下吧:
from rest_framework.versioning import BaseVersioning
我们看下源码: Ctrl + BaseVersioning:
class BaseVersioning(object):
"""
基础版本类
"""
class AcceptHeaderVersioning(BaseVersioning):
"""
再请求头中
"""
class URLPathVersioning(BaseVersioning):
"""
在URL中
"""
class NamespaceVersioning(BaseVersioning):
"""
用namespace
"""
class HostNameVersioning(BaseVersioning):
"""
通过主机域
"""
class QueryParameterVersioning(BaseVersioning):
"""
通过URL查询参数
"""
三、URLPathVersioning控制方法
今天我们主要讲解的是 URLPathVersioning 是如何控制的版本的。
3.1、配置文件
说明:在settings.py的配置文件中,配置版本控制。我们测试的时候用的是全局配置。
#settings.py中全局配置
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (...), #认证方式
'DEFAULT_PERMISSION_CLASSES': (...), #权限控制
'DEFAULT_THROTTLE_CLASSES': [....], #节流
'DEFAULT_THROTTLE_RATES': {...}, #限制数
# 版本
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', #采用的是URL方式控制版本
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
}
这个是全局配置,当然你如果需要 局部配置 的话,需要在具体视图中使用:
#具体视图中局部配置
versioning_class = "rest_framework.versioning.URLPathVersioning" #注意不是列表
3.2、视图
说明:编写views.py,新增一个视图类
class VersionView(APIView):
def get(self, request, *args, **kwargs):
#获取版本:v1 或者 v2(全局里面定义)
print(request.version)
# 获取版本管理的类: <rest_framework.versioning.URLPathVersioning object at 0x0000016B6F3F9630>
print(request.versioning_scheme)
# 反向生成URL: http://127.0.0.1:8000/api/v1/version
reverse_url = request.versioning_scheme.reverse('version', request=request) #version是子路由中的name
print(reverse_url)
if request.version == "v1":
ctx = {"code": 1, "msg": "ok", "data": {}}
else:
ctx = {"code": 2, "msg": "ok", "data": {}}
return JsonResponse(ctx)
3.3、路由
说明:在具体app下的路由配置
from django.urls import path
from app05 import views
urlpatterns = [
path("<str:version>/version", views.VersionView.as_view(), name="version")
]
3.4、postman测试
v1版本:

v2版本:

v3版本:因为v3版本我们在全局变量中没有定义,所以没有v3版本:

四、类视图URLPathVersioning控制
上面我用的APIView,写的随意比较大一些,但是我们之前学过类视图,对吧,他里面已经帮我们封装的很好了,那我们咋办呐。哈哈,这个时候我们就需要重写我们的get_queryset方法了:
class GameList(generics.ListCreateAPIView):
serializer_class = GameSerializer
def get_queryset(self): #重写get_queryset方法
if self.request.version == "v1":
queryset = Game.objects.filter(status=1).all()
else:
queryset = Game.objects.filter(status=0).all()
return queryset
# def get_serializer_class(self): #序列化类也是可以支持重写的
# pass
这边我们就不带大家测试了。其他的设置都是一样的,除了视图不一样。

浙公网安备 33010602011771号