• 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("用户列表")
    
  • 相关阅读:
    python学习笔记1--datetime的使用
    python学习笔记2--子类父类继承时的参数传递
    python学习笔记1--错误,异常,调试
    JS同异步编程
    AMD /CMD
    i++ && ++i
    将url问号后面的参数变成对象
    字符串的常用方法
    函数 && 函数运行机制
    Math数学函数及常用方法
  • 原文地址:https://www.cnblogs.com/xujunkai/p/11849866.html
Copyright © 2020-2023  润新知