【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

 

posted @ 2018-12-15 21:42  st--st  阅读(262)  评论(0编辑  收藏  举报