码迷,mamicode.com
首页 > 其他好文 > 详细

Django REST framework - 版本控制

时间:2019-02-04 18:02:23      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:serialize   namespace   path   查询参数   cts   str   解决   else   版本控制系统   

Django REST framework 版本控制

为什么需要版本控制

API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据)。 DRF提供了许多不同的版本控制方案。

可能会有一些客户端因为某些原因不再维护了,但是我们后端的接口还要不断的更新迭代,这个时候通过版本控制返回不同的内容就是一种不错的解决方案。

DRF提供了5种版本控制方案

# 将版本信息放到请求头中:
class AcceptHeaderVersioning(BaseVersioning):
    pass

# 将版本信息放到URL中:
class URLPathVersioning(BaseVersioning):
    pass

# 通过namespace来区分版本
class NamespaceVersioning(BaseVersioning):
    pass

# 通过主机名来区分版本
class HostVersioning(BaseVerioning):
    pass

# 通过URL查询参数区分版本
class QueryParameterVersioning(BaseVersioning)

版本控制系统的使用

这里我们介绍 将版本信息放到URL中 和 通过URL查询参数区分版本

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'})),
]   

全局配置

/v1/books/

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',  # 默认的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
    'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
}

/books/?version=v1

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.QueryParameterVersioning',
    'DEFAULT_VERSION': 'v1',  # 默认的版本
    'ALLOWED_VERSIONS': ['v1', 'v2'],  # 有效的版本
    'VERSION_PARAM': 'version',  # 版本的参数名与URL conf中一致
}

局部配置

注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下

class PublisherViewSet(ModelViewSet):
    ... 
    versioning_class = URLPathVersioning

获取版本信息

我们在视图中可以通过访问 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()

Django REST framework - 版本控制

标签:serialize   namespace   path   查询参数   cts   str   解决   else   版本控制系统   

原文地址:https://www.cnblogs.com/konghui/p/10351913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!