DRF版本控制组件

为什么要进行版本控制?

新旧版本的接口都要维护,发请求的时候带上版本号会返回不同的结果,例如bootstrap2.0 、3.0等都有文档

版本控制组件源码---

as_view调用View的dispatch方法,dispatch被重写了,所以调用APIView的dispatch方法

self是DemoView的实例化对象

DRF版本控制组件

 把版本信息放在了request.version和request.versioning_scheme中

DRF版本控制组件

 determine_version返回元祖(version, scheme)

DRF版本控制组件

DRF版本控制组件

 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版本控制组件DRF版本控制组件DRF版本控制组件

一般情况,使用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"
}

 DRF版本控制组件