解决:通过参数传递版本号
a. 通过url路径传参
from rest_framework.versioning import URLPathVersioning
b. url中通过GET传参
from rest_framework.versioning import QueryParameterVersioning
注:所有的版本类一定有 determine_version(self, request, *args, **kwargs) 方法,用于把版本获取到。
一。在URL路径中传参(推荐使用)
1. 在settting中定义版本参数,有四个,一个全局的版本功能对象,一个默认的版本,一个允许的版本(如果是不允许的版本,会返回错误),一个传递的参数名称。
REST_FRAMEWORK = {
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning", # 设置全局版本功能
"DEFAULT_VERSION":"v1", # 默认的版本
"ALLOWED_VERSIONS":['v1', 'v2'], # 允许的版本
"VERSION_PARAM":"version", # 传递的参数名
}
2. 在urls中定义要传递的版本名称:
urlpatterns = [
url('^api/(?P<version>[v1|v2]+)/version/$', views.Version.as_view(), name='version'),
]
3. 因为是全局设置,所以视图中不用设置也可以
class Version(APIView):
def get(self, request, *args, **kwargs):
print(request.version) # 版本数据
print(request.versioning_scheme) # 版本对象,这里的对象是QueryParameterVersioning
# 反向生成url, 参数viewname是url的名称
u1 = request.versioning_scheme.reverse(viewname="version", request=request)
# 结果是:http://127.0.0.1:8000/api/v2/version/
return JsonResponse({"x":'x'})
4. 效果:
二。URL中通过GET传参(不推荐)
1. 在settting中定义版本参数,有三个,一个默认的版本,一个允许的版本(如果是不允许的版本,会返回错误),一个传递的参数名称。
REST_FRAMEWORK = {
"DEFAULT_VERSION":"v1", # 默认的版本
"ALLOWED_VERSIONS":['v1', 'v2'], # 允许的版本
"VERSION_PARAM":"version", # 传递的参数名
}
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. 结果如图