Django:RestFramework之-------版本控制

6.版本控制

  • 从URL通过get传参获取版本。

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<version>[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<version>[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("用户列表")
原文地址:https://www.cnblogs.com/xujunkai/p/11849866.html