什么是版本控制

在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版本,肯定有用户不会去升级新版本,所以旧版本的软件当然也可以正常使用的

所以,我们要对其做版本控制,多个版本共存

使用DRF的版本控制组件

新建一个drfversion的django项目,现在该目录的settings.py文件里的app添加rest_framework,建一个叫DRF的app,做好对应的路由分发:

创建一个试图类,其中request.version是读DRF的源码所得,version就是版本参数

且还需要在配置文件里配置如下才行:

REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning", # DRF自带的
    "DEFAULT_VERSION": "v1", #默认的版本
    "ALLOWED_VERSIONS": "v1, v2", #允许的版本
    "VERSION_PARAM": "ver" # url上的关键词,如:/XX?ver=v1
}

启动项目:

默认就是v1版本

访问v2:

访问v3:

version到底是什么,还有通过读源码得到这个versioning_schme,这两个参数是在源码中看到的:

打印试试:

对了,这个versioning_schme就是刚才我们在配置文件里配置那个参数

其实DRF还有很多这种版本控制分发组件,都在versioning模块里:from rest_framework import versioning

一共这么多,看名字就知道大概是什么用法,最后一个就是刚才用到的

自定义版本控制组件

从前面可以得知,就只需要再自定义一个versioning类就可以了

再看DRF自带的versioning,都定义额这个determine_version

且读源码可知,如果自定义一个versioning,那就必须要定义一个这个determine_version方法,注意看我自定义的Myversion没有继承DRF提供的版本控制类

最后就是在settings.py里应用上就行了,就跟django的中间件一样:

view(其实没有作改动):

运行,访问测试:

正常访问,而且打印的结果,这就是我们自定义的versioning

注意:自定义版本控制组件类确实不需要继承DRF自带的BaseVersioning类就可以实现版本控制,我上面代码中继承的是object,当然也可以继承上,效果是一样的,就不展示访问测试页面了

相关代码: 

version:

from rest_framework.versioning import BaseVersioning

# class MyVersion(BaseVersioning):  可以不继承也行
class MyVersion(object):
    def determine_version(self, request, *args, **kwargs):
        version = request.query_params.get('ver', 'v1')
        return version

url:

from django.contrib import admin
from django.urls import path, re_path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path(r'test/', include(('DRF.urls'))),
]
from django.urls import path, re_path
from DRF.views import DemoView
urlpatterns = [
    re_path(r'^version/', DemoView.as_view()),
]

view:

from django.shortcuts import render
# Create your views here.
from rest_framework.views import APIView
from rest_framework.views import Response

class VersionView(APIView):
    def get(self, request):
        print('version', request.version)
        print('versioning_scheme', request.versioning_scheme)
        if request.version == 'v1':
            return Response('v1版本')
        elif request.version == 'v2':
            return Response('v2版本')
        return Response('不存在的版本')

总结:

  • 版本控制,需要在配置文件里配置参数
  • 自定义版本控制,必须定义determine_version方法,可以不用继承BaseVersioning类
  • 获取url的条件参数用request.query_params

最新文章

  1. JavaWeb---设置content-disposition响应头,让浏览器下载文件
  2. 网络误区:不用中间变量交换2个变量的value,最高效的是异或运算.
  3. absolute绝对定位可以实现相对定位
  4. dojo/dom dojo/domConstruct dojo/query
  5. FJNU 1151 Fat Brother And Geometry(胖哥与几何)
  6. Torry的困惑(基本型)
  7. iOS 9之Safari广告拦截器(Content Blocker)
  8. Choose the best route--hdu2680
  9. Beauty of Array(模拟)
  10. 逆波兰表达式(RPN)算法简单实现
  11. Linux显示所有可更新的软件清单命令
  12. 为eclipse安装subclipse(SVN插件)
  13. python语法_集合
  14. Apache Maven 3.6.1配置安装
  15. C#字符串。
  16. 2016vijos 1-2 股神小L(堆)
  17. fluxion-wifi破解/钓鱼
  18. yarn 学习 小记
  19. C# Language Specification 5.0 (翻译)第五章 变量
  20. springMVC实现json

热门文章

  1. [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)
  2. Unity中雾效的开启
  3. MFC控件编程之组合框跟列表框
  4. Mybatis的SqlSession运行原理
  5. c# 关于字段内存排序
  6. 从零开始学安全(二十四)●用Nmap发现主机
  7. Netty实战五之ByteBuf
  8. css3巧用选择器配合伪元素
  9. 谈谈你对 Java 平台的理解
  10. 使用FileReader接口读取文件内容