【一】为什么需要版本控制
- API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。
- DRF提供了许多不同的版本控制方案。
- 可能会有一些客户端因为某些原因不再维护了
- 但是我们后端的接口还要不断的更新迭代
- 这个时候通过版本控制返回不同的内容就是一种不错的解决方案。
【二】DRF提供的版本控制方案
- DRF提供了五种版本控制方案,如下图:
【三】版本控制系统的使用
【1】全局配置
- 这里我们以 URLPathVersioning 为例
- 还是在项目的settings.py中REST_FRAMEWORK配置项下配置:
REST_FRAMEWORK = {
...
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION': 'v1', # 默认的版本
'ALLOWED_VERSIONS': ['v1', 'v2'], # 有效的版本
'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
}
- urls.py中
urlpatterns = [
...
url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherViewSet.as_view({'get': 'list', 'post': 'create'})),
url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>\d+)/$', views.PublisherViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
]
- 我们在视图中可以通过访问 request.version 来获取当前请求的具体版本
- 然后根据不同的版本来返回不同的内容:
- 我们可以在视图中自定义具体的行为
- 下面以不同的版本返回不同的序列化类为例
class PublisherViewSet(ModelViewSet):
def get_serializer_class(self):
"""不同的版本使用不同的序列化类"""
if self.request.version == 'v1':
return PublisherModelSerializerVersion1
else:
return PublisherModelSerializer
queryset = models.Publisher.objects.all()
【2】局部配置
- 注意
- 通常我们是不会单独给某个视图设置版本控制的
- 如果你确实需要给单独的视图设置版本控制
- 你可以在视图中设置versioning_class属性,如下:
class PublisherViewSet(ModelViewSet):
...
versioning_class = URLPathVersioning
标签:版本控制,不同,视图,Django,v1,Rest,版本,class
From: https://www.cnblogs.com/dream-ze/p/17559516.html