Django REST framework - 版本控制

Django REST framework 版本控制

爲何須要版本控制

API 版本控制容許咱們在不一樣的客戶端之間更改行爲(同一個接口的不一樣版本會返回不一樣的數據)。 DRF提供了許多不一樣的版本控制方案。後端

可能會有一些客戶端由於某些緣由再也不維護了,可是咱們後端的接口還要不斷的更新迭代,這個時候經過版本控制返回不一樣的內容就是一種不錯的解決方案。post

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查詢參數區分版本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屬性,以下spa

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

獲取版本信息

咱們在視圖中能夠經過訪問 request.version 來獲取當前請求的具體版本,而後根據不一樣的版原本返回不一樣的內容:版本控制

咱們能夠在視圖中自定義具體的行爲,下面以不一樣的版本返回不一樣的序列化類爲例rest

class PublisherViewSet(ModelViewSet):

    def get_serializer_class(self):
        #不一樣的版本使用不一樣的序列化類
        if self.request.version == 'v1':
            return PublisherModelSerializerVersion1
        else:
            return PublisherModelSerializer
    queryset = models.Publisher.objects.all()
相關文章
相關標籤/搜索