zoukankan      html  css  js  c++  java
  • 【DRF框架】版本控制组件

    DRF框架提供的版本控制组件

    核心代码:          

    version, scheme = self.determine_version(request, *args, **kwargs)
    request.version, request.versioning_scheme = version, scheme

    框架自带的模块:    from rest_framework import versioning

    在视图中:

    1.获取版本号:request.version          

    2.获取版本控制的类:request.versioning_scheme

    from rest_framework import versioning

    from rest_framework import versioning
    
    # 最基础的版本控制类
    class BaseVersioning(object)
        # 必须重写该方法
        def determine_version(self, request, *args, **kwargs):
    
    
    # 基于URL的版本控制类
    class URLPathVersioning(BaseVersioning):
       """
        urlpatterns = [
            url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
            url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
        ]
    
        GET /1.0/something/ HTTP/1.1
        Host: example.com
        Accept: application/json
        """

     

    基于BaseVersioning类的版本控制

    '''
    基于DRF框架的版本控制组件
    # my_version.py
    '''
    from rest_framework import versioning
    
    
    # 基于BaseVersioning类的版本控制
    class MyVersion(versioning.BaseVersioning):
        default_version = "v1"      # 默认的版本
        allowed_versions = ['v1','v2']     # 允许的版本
        # 继承BaseVersioning必须重写
        def determine_version(self, request, *args, **kwargs):
            # 获取参数,获取/api/version/test/?version='xxx'的值
            version = request.query_params.get('version',self.default_version)
            if self.is_allowed_version(version):    # 判断版本是否在允许的版本里
                return version          # 赋值给request.version
            return None
    
    
    # views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from utils.my_version import MyVersion
    
    # Create your views here.
    
    class VersionView(APIView):
        versioning_class = MyVersion    # 局部使用版本控制
        def get(self,request):
            if request.version:         # MyVersion类中determine_version的返回值
                return Response("版本测试接口")
            else:
                return Response("版本不合法")

     

     

    基于URLPathVersioning类的版本控制

    # settings.py
    REST_FRAMEWORK = {
        'DEFAULT_VERSION': "v1",
        'ALLOWED_VERSIONS': ["v1", "v2"],
    }
    # views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import versioning
    # Create your views here.
    
    class VersionView2(APIView):
        versioning_class = versioning.URLPathVersioning    # 局部使用版本控制
        def get(self,request,version):
            print(request.version)
            return Response("版本测试接口")
    # urls.py
    url(r'^api/(?P<version>[v1|v2]+)/',include('VersionDemo.urls'))  # 版本控制,基于URLPathVersioning

     

    源码流程

    def initial(self, request, *args, **kwargs):
        # 1、获取版本号, 返回一个元祖(,)
        version, scheme = self.determine_version(request, *args, **kwargs)
        # 2、给request追加版本号和versioning_scheme
        request.version, request.versioning_scheme = version, scheme  
        
    
    def determine_version(self, request, *args, **kwargs):
        # 3、查找指定的版本规则
        if self.versioning_class is None:
            return (None, None)
        # 3.1、实例化version对象
        scheme = self.versioning_class()
        # 3.2、调用对象的类的determine_version方法
        return (scheme.determine_version(request, *args, **kwargs), scheme) 
    
    
    class QueryParameterVersioning(BaseVersioning):
        def determine_version(self, request, *args, **kwargs):
            # 4、进入对应版本类调用determine_version方法,获取version
            version = kwargs.get(self.version_param, self.default_version)
            
            # version_param默认就是version
            if not self.is_allowed_version(version):
                raise exceptions.NotFound(self.invalid_version_message)
            return version

     

  • 相关阅读:
    Java反射获取对象VO的属性值(通过Getter方法)
    HTML的级联Select
    ORACLE 新增记录 & 更新记录
    ORACLE 仿照原表建表语法
    ActiveMQ反序列化漏洞(CVE-2015-5254)复现
    滥用DNSAdmins权限进行Active Directory提权
    Weblogic CVE-2018-3191远程代码命令执行漏洞复现
    Libssh认证绕过CVE-2018-10933漏洞复现
    Linux kernel(CVE-2018-17182)提权漏洞复现
    时间延迟盲注详解
  • 原文地址:https://www.cnblogs.com/st-st/p/10124813.html
Copyright © 2011-2022 走看看