zoukankan      html  css  js  c++  java
  • DRF版本控制组件

    为什么要进行版本控制?

    新旧版本的接口都要维护,发请求的时候带上版本号会返回不同的结果,例如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"
    }

     

  • 相关阅读:
    8.02_python_lx_day14
    8.02_python_lx_day13<2>
    8.02_python_lx_day13<1>
    7.30_python_lx_day20
    7.29_python_lx_da19
    7.29_python_lx_day12
    Docker镜像
    Docker学习Ⅱ
    Docker学习Ⅰ
    2-3树的插入和删除原理
  • 原文地址:https://www.cnblogs.com/staff/p/12604071.html
Copyright © 2011-2022 走看看