6.版本控制
6.1自定义版本控制
from rest_framework.views import APIView
class ParamVersion(object):
def determine_version(self,request,*args,**kwargs):
version = request.query_params.get("version")
return version
class UserView(APIView):
versioning_class = ParamVersion
def get(self,request,*args,**kwargs):
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
6.2内置类版本控制
#方式1:
#settings.py配置
REST_FRAMEWORK = {
#默认版本V1
"DEFAULT_VERSION":"V1",
#允许版本V1,V2
"ALLOWED_VERSIONS":["V1","V2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
from rest_framework.versioning import QueryParameterVersioning
class UserView(APIView):
#版本控制直接等于QueryParameterVersioning类即可,内部封装N多个方法
versioning_class = QueryParameterVersioning
def get(self,request,*args,**kwargs):
#通过request.version可打印版本
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
#方式2:在路经中传参
#键入http://127.0.0.1:8000/api/v1/users/,获取版本 ***最常用
#settings.py配置
REST_FRAMEWORK = {
#控制版本执行的类
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
#默认版本号
"DEFAULT_VERSION":"v1",
#允许版本号
"ALLOWED_VERSIONS":["v1","v2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
#url配置:
urlpatterns = [
url(r'^(?P[v1|v2]+)/users/$', views.UserView.as_view()),
]
#views.py 视图函数使用
from rest_framework.versioning import URLPathVersioning
class UserView(APIView):
#直接等于URLPathVersioning
versioning_class = URLPathVersioning
def get(self,request,*args,**kwargs):
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
6.3版本控制之源码解析:
#老套路dispatch方法,执行initial:
def initial(self, request, *args, **kwargs):
#这两行代码用于处理版本
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
#request.version获取版本
#request.versioning_scheme获取处理版本对象
#进入determine_version,用于
def determine_version(self, request, *args, **kwargs):
"""
If versioning is being used, then determine any API version for the
incoming request. Returns a two-tuple of (version, versioning_scheme)
"""
if self.versioning_class is None:
return (None, None)
#处理版本类的对象
#versioning_class = api_settings.DEFAULT_VERSIONING_CLASS 或者 自定义
scheme = self.versioning_class()
#第一个参数为调用版本类的determine_version,获取到版本
#第二个参数,返回处理版本对象是哪个?
return (scheme.determine_version(request, *args, **kwargs), scheme
#那么scheme.determine_version(request, *args, **kwargs)如何获得版本,当执行版本类URLPathVersioning(内置的),它会执行如下方法:
def determine_version(self, request, *args, **kwargs):
version = kwargs.get(self.version_param, self.default_version)
if version is None:
version = self.default_version
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
#返回当前版本
return version
6.4内置方法:
#获取版本
print(request.version)
#根据url上name反向获取当前url
#reverse 执行时会把 request.version的得到的版本值 放入kwargs中,并生成url
url = request.versioning_scheme.reverse(viewname='uuu',request=request)
6.5版本总结
不需要自定义:
直接使用:
配置:
REST_FRAMEWORK = {
#控制版本执行的类
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
#默认版本号
"DEFAULT_VERSION":"v1",
#允许版本号
"ALLOWED_VERSIONS":["v1","v2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
路由:
url(r'^(?P[v1|v2]+)/users/$', views.UserView.as_view(),name='uuu'),
视图:
class UserView(APIView):
versioning_class = URLPathVersioning
def get(self,request,*args,**kwargs):
print(request.version)
url = request.versioning_scheme.reverse(viewname='uuu',request=request)
print(url)#http://127.0.0.1:8000/api/v1/users/
return HttpResponse("用户列表")