Django Rest Framework 源碼解讀( 五)版本流程

這是我參與更文挑戰的第17天,活動詳情查看: 更文挑戰html

經過參數傳遞版本號python

a. 經過url路徑傳參django

from rest_framework.versioning import URLPathVersioning
複製代碼

b. url中經過GET傳參api

from rest_framework.versioning import QueryParameterVersioning
複製代碼

1 版本的重要性

RESTful 規範中,有關版本的問題,用restful規範作開放接口的時候,用戶請求API,系統返回數據。可是不免在系統發展的過程當中,不可避免的須要添加新的資源,或者修改現有資源。所以,改動升級必不可少,可是,做爲平臺開發者,應該知道:一旦你的API開放出去,有人開始用了,平臺的任何改動都須要考慮對當前用戶的影響。所以,作開放平臺,從第一個API的設計就須要開始API的版本控制策略問題,API的版本控制策略就像是開放平臺和平臺用戶之間的長期協議,其設計的好壞將直接決定用戶是否使用該平臺,或者說用戶在使用以後是否會由於某次版本升級直接棄用該平臺。restful

2 在URL路徑中傳參(推薦使用)

2.1 在settting中定義版本參數

有四個,一個全局的版本功能對象,一個默認的版本,一個容許的版本(若是是不容許的版本,會返回錯誤),一個傳遞的參數名稱。markdown

REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning",  # 設置全局版本功能
    "DEFAULT_VERSION":"v1",             # 默認的版本
    "ALLOWED_VERSIONS":['v1', 'v2'],    # 容許的版本
    "VERSION_PARAM":"version",          # 傳遞的參數名
}
複製代碼

2.2 在urls中定義要傳遞的版本名稱

外層路由作分發oop

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path

urlpatterns = [
    url(r'^api/', include('api.urls')),
]

複製代碼

2.3 APP層路由實現業務

urlpatterns = [
    re_path(r'^(?P<version>v\d)/users/$', views.UserView.as_view(), name='user'),
]
複製代碼

2.4 由於是全局設置,因此視圖中不用設置也能夠

class UserView(APIView):
    def get(self, request, *args, **kwargs):
        print(request.version)
        print(request.versioning_scheme.reverse(viewname="user", request=request))
        return HttpResponse('用戶列表')
複製代碼

2.5 效果:

http://127.0.0.1:8000/api/v1/users/ # OK
複製代碼
http://127.0.0.1:8000/api/v3/users/

{
    "detail": "Invalid version in URL path."
}
複製代碼

3 URL中經過GET傳參(不推薦)

3.1 在settting中定義版本參數

有三個,一個默認的版本,一個容許的版本(若是是不容許的版本,會返回錯誤),一個傳遞的參數名稱。post

REST_FRAMEWORK = {
    "DEFAULT_VERSION":"v1",             # 默認的版本
    "ALLOWED_VERSIONS":['v1', 'v2'],    # 容許的版本
    "VERSION_PARAM":"version",          # 傳遞的參數名
}
複製代碼

3.2 在視圖views中填入 versioning_class 類參數(request.version是返回的參數結果)

from rest_framework.versioning import QueryParameterVersioning
class Version(APIView):
    versioning_class = QueryParameterVersioning
    def get(self, request, *args, **kwargs):
        print(request.version)                  #返回的版本結果
        print(request.versioning_scheme)    # 版本對象,這裏的對象是QueryParameterVersioning
        return JsonResponse({"x":'x'})
複製代碼

3.3 結果如圖

http://127.0.0.1:8000/api/users/?version=v1
複製代碼
相關文章
相關標籤/搜索