返回顶部

DRF之版本控制

一. 简介

  随着我们项目的更新,版本就越来越多,我们不可能新的版本出了, 以前旧的版本就不进行维护了吧。

  那我们就需要对版本进行控制, 这个DRF也给我们提供了一些封装好的版本控制方法。

1.源码流程:

 

 

 

  执行self.initial方法之前是各种赋值,包括request的重新封装赋值,下面是路由的分发,那我们看下这个方法都做了什么

  我们可以看到,我们的version版本信息赋值给了 request.version  版本控制方案赋值给了 request.versioning_scheme。

  其实这个版本控制方案就是我们配置的版本控制的类

  也就是说,APIView通过这个方法初始化自己提供的组件, 我们接下来看看框架提供了哪些版本的控制方法,在rest_framework.versioning里:

 

2. 基本配置

做了一层路由分发:

path('version/', include('version.urls'))

urls:

from django.urls import path
from version.views import VersionView

urlpatterns = [
    path('', VersionView.as_view())
]

views:

from rest_framework.views import APIView
from rest_framework.response import Response

from utiles.myversion import Myversion

class VersionView(APIView):

    # versioning_class = Myversion

    def get(self, request):
        print(request.versioning_scheme)
        if request.version == 'v1':
            return Response('v1的版本')
        elif request.version == 'v2':
            return Response('v2的版本')
        return Response('不允许的版本')

自己写的myversion类,可以继承一个基本的版本类: BaseVersioning

from rest_framework.versioning import BaseVersioning

class Myversion(BaseVersioning):

    def determine_version(self, request, *args, **kwargs):
        version = request.query_params.get('ver', 'v1')
        return version

上面这个把version放在url请求参数中,其实就是DRF给我们提供的一个叫 QueryParameterVersioning的功能是一样的。我们直接用这个类就可以了。

http://127.0.0.1:8000/version/?ver=v2

 

3. 全局和局部生效

全局:settings中:

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'utiles.myversion.Myversion',
    'DEFAULT_VERSION': 'v1',
    'ALLOWED_VERSIONS': 'v1,v2',
    'VERSION_PARAM': 'ver'
}

 

局部:视图函数中:

class VersionView(APIView):

    versioning_class = Myversion

    def get(self, request):
        print(request.versioning_scheme)
        if request.version == 'v1':
            return Response('v1的版本')
        elif request.version == 'v2':
            return Response('v2的版本')
        return Response('不允许的版本')

 

4. 其他版本控制类使用

URLPathVersioning,在路径中传参数继续版本控制

urls:

re_path(r'^(?P<version>\w+)/$', VersionView2.as_view())

views:


from rest_framework.versioning import URLPathVersioning

class
VersionView2(APIView): versioning_class = URLPathVersioning def get(self, request, *args, **kwargs): print(request.versioning_scheme) version = kwargs.get('version') return Response(version)

全局配置:

REST_FRAMEWORK = {
    # 'DEFAULT_VERSIONING_CLASS': 'utiles.myversion.Myversion',
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',
    'ALLOWED_VERSIONS': 'v1,v2',
    'VERSION_PARAM': 'version'
}

 

5. 反向生成URL

通过request.versioning_scheme的reverse方法反向生成URL:

re_path(r'^(?P<version>\w+)/$', VersionView2.as_view(), name='666')

print(request.versioning_scheme.reverse(viewname='666', request=request))

# http://127.0.0.1:8000/version/v1/

 

posted @ 2020-10-14 18:07  muguangrui  阅读(154)  评论(0编辑  收藏  举报