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/