1. 程式人生 > >Django REST Framework - 版本控制

Django REST Framework - 版本控制

nbsp eve 請求 model 定義 mode 分享圖片 and con

Django REST Framework - 版本控制

為什麽需要版本控制? 

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

  可能會有一些客戶端因為某些原因不再維護了,但是我們後端的接口還要不斷的更新叠代,這個時候通過版本控制返回不同的內容就是一種不錯的解決方案。

DRF提供的版本控制的方案

  DRF提供了5種版本控制方案, 如下圖:

技術分享圖片

版本控制系統的使用>>>>>>>>>>>>>>>>>.

  全局配置>>>

  

這裏我們以 URLPathVersioning 為例,還是在項目的settings.py中REST_FRAMEWORK配置項下配置:

/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中一致
}

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()

局部配置  

  註意,通常我們是不會單獨給某個視圖設置版本控制的,如果你確實需要給單獨的視圖設置版本控制,你可以在視圖中設置versioning_class屬性,如下

class PublisherViewSet(ModelViewSet):

    ...
    versioning_class = URLPathVersioning

源碼分析:

  request.verysion 都經歷了什麽?

技術分享圖片

  版本控制能做什麽?

技術分享圖片

技術分享圖片

Django REST Framework - 版本控制