为什么要进行版本控制?
新旧版本的接口都要维护,发请求的时候带上版本号会返回不同的结果,例如bootstrap2.0 、3.0等都有文档
版本控制组件源码---
as_view调用View的dispatch方法,dispatch被重写了,所以调用APIView的dispatch方法
self是DemoView的实例化对象
把版本信息放在了request.version和request.versioning_scheme中
determine_version返回元祖(version, scheme)
request.scheme是配置文件中"DEFAULT_VERSIONING_CLASS"的实例化对象
request.version是"DEFAULT_VERSIONING_CLASS"类的determine_version方法的返回值
所以,"DEFAULT_VERSIONING_CLASS"类必须要有determine_version方法。
项目urls:
from django.urls import path, include urlpatterns = [ path('version/', include('versionDemo.urls')), ]
app中urls:versionDemo.urls
urlpatterns = [ path(r'', views.DemoView.as_view()), ]
settings.py中加上"DEFAULT_VERSIONING_CLASS"
REST_FRAMEWORK = { "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion" }
在项目下创建utils/version.py,创建MyVersion类
class MyVersion: def determine_version(self, request, *args, **kwargs): # 版本号在请求参数中 xxx?version=v1.1 version = request.query_params.get("version", "v1") return version
views.py
from rest_framework.views import APIView from rest_framework.response import Response class DemoView(APIView): def get(self, request): print(request.version) # print(request.versioning_scheme) # <utils.version.MyVersion object at 0x00000000053231D0> if request.version == "v1": return Response("v1版本数据") if request.version == "v2": return Response("v2版本数据") return Response("不存在的版本")
一般情况,使用DRF提供的版本控制类就能满足需求了。
from rest_framework import versioning
使用DRF提供的版本控制组件,需要在settings.py中配置一下参数
........ REST_FRAMEWORK = { "DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion", "DEFAULT_VERSION": "v1", "ALLOWED_VERSIONS": ["v1", "v2", "v3"], "VERSION_PARAM": "ver" }