这是我参与更文挑战的第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
复制代码