這是我參與更文挑戰的第17天,活動詳情查看: 更文挑戰html
經過參數傳遞版本號python
a. 經過url路徑傳參django
from rest_framework.versioning import URLPathVersioning
複製代碼
b. url中經過GET傳參api
from rest_framework.versioning import QueryParameterVersioning
複製代碼
在RESTful 規範中,有關版本的問題,用restful規範作開放接口的時候,用戶請求API,系統返回數據。可是不免在系統發展的過程當中,不可避免的須要添加新的資源,或者修改現有資源。所以,改動升級必不可少,可是,做爲平臺開發者,應該知道:一旦你的API開放出去,有人開始用了,平臺的任何改動都須要考慮對當前用戶的影響。所以,作開放平臺,從第一個API的設計就須要開始API的版本控制策略問題,API的版本控制策略就像是開放平臺和平臺用戶之間的長期協議,其設計的好壞將直接決定用戶是否使用該平臺,或者說用戶在使用以後是否會由於某次版本升級直接棄用該平臺。restful
有四個,一個全局的版本功能對象,一個默認的版本,一個容許的版本(若是是不容許的版本,會返回錯誤),一個傳遞的參數名稱。markdown
REST_FRAMEWORK = {
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning", # 設置全局版本功能
"DEFAULT_VERSION":"v1", # 默認的版本
"ALLOWED_VERSIONS":['v1', 'v2'], # 容許的版本
"VERSION_PARAM":"version", # 傳遞的參數名
}
複製代碼
外層路由作分發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')),
]
複製代碼
urlpatterns = [
re_path(r'^(?P<version>v\d)/users/$', views.UserView.as_view(), name='user'),
]
複製代碼
class UserView(APIView):
def get(self, request, *args, **kwargs):
print(request.version)
print(request.versioning_scheme.reverse(viewname="user", request=request))
return HttpResponse('用戶列表')
複製代碼
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."
}
複製代碼
有三個,一個默認的版本,一個容許的版本(若是是不容許的版本,會返回錯誤),一個傳遞的參數名稱。post
REST_FRAMEWORK = {
"DEFAULT_VERSION":"v1", # 默認的版本
"ALLOWED_VERSIONS":['v1', 'v2'], # 容許的版本
"VERSION_PARAM":"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'})
複製代碼
http://127.0.0.1:8000/api/users/?version=v1
複製代碼