什么是版本控制

在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的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

前后端分离djangorestframework——版本控制组件的更多相关文章

  1. 前后端分离djangorestframework—— 在线视频平台接入第三方加密防盗录视频

    加密视频 在以后的开发项目中,很可能有做在线视频的,而在线视频就有个问题,因为在线播放,就很有可能视频数据被抓包,如果这个在线视频平台有付费视频的话,这样就会有人做点倒卖视频的生意了,针对这个问题,目 ...

  2. 前后端分离djangorestframework—— 接入第三方的验证码平台

    关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...

  3. 前后端分离djangorestframework——分页组件

    Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用  前后端分离djangorestframework——序列化与反序列化数据  文章里用到的数据,数据库用的my ...

  4. 前后端分离djangorestframework——路由组件

    在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...

  5. 前后端分离djangorestframework——视图组件

    CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...

  6. 前后端分离djangorestframework——序列化与反序列化数据

    我们写好后端的代码,要把数据交给前端的展示的,这个数据以什么类型给前端呢?学到这里,我们已经知道这个数据最好是json字符串才行,因为网络间的传输,只认字符串或者二进制,字符串就是我们的数据,二进制就 ...

  7. 前后端分离djangorestframework——认证组件

    authentication 认证是干嘛的已经不需要多说.而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token 全局认证 先创建一个django项目,项目名为drf ...

  8. 前后端分离djangorestframework——restful规范

    restful现在非常流行,所以很有必要提一下 web服务交互 在浏览器中能看到的每个网站,都是一个web服务.那么我们在提供每个web服务的时候,都需要前后端交互,前后端交互就一定有一些实现方案,我 ...

  9. 前后端分离djangorestframework——解决跨域请求

    跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...

随机推荐

  1. 自动化测试 | UI Automator 进阶指南

    UI Automator 相关介绍: 跨应用的用户界面自动化测试 包含在 AndroidX Test(https://developer.android.com/training/testing) 中 ...

  2. Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

    现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下.如果您也碰到了同样的问题,希望本文对您有用. 问题描述 @Ap ...

  3. Android开发过程中的坑及解决方法收录(二)

    bug 1: bug描述: 无法成功地将edittext中的内容传入数据库中 bug动图: 经过: 最近写了个项目,项目要使用到SQL数据库,由于没有相关知识,便是找到了各种资料开始了自学之旅,在de ...

  4. junit单元测试注意的问题

    1.有返回值的方法不能直接测试 2.带参数的方法不能直接测试 3.访问权限在public一下的方法不能直接测试 4.static静态方法不能直接测试 5.不能给出现前四个条件中任意一个的方法添加@Te ...

  5. vim 中:wq和:wq的不同之处

  6. Linux下Python安装完成后如何使用pip命令

    一.很多读者Python安装完成之后,想要下载相关的包,例如:numpy.pandas等Python中这些基础的包,但是,发现pip根本用不了,主要表现在一下几种情况: 二.出现这种情况其实并不意外, ...

  7. angular 去掉url里面的#

    1.适合客户端的方法,但是页面不能刷新,一刷新就404 (1)在index.html里添加 <base href="/"> (2)在app.js的config里,注入$ ...

  8. JS实现数组去重方法整理

    前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...

  9. BZOJ4559: [JLoi2016]成绩比较(dp 拉格朗日插值)

    题意 题目链接 Sol 想不到想不到.. 首先在不考虑每个人的真是成绩的情况下,设\(f[i][j]\)表示考虑了前\(i\)个人,有\(j\)个人被碾压的方案数 转移方程:\[f[i][j] = \ ...

  10. loadrunner 脚本优化-集合点设置

    脚本优化-集合点设置 by:授客 QQ:1033553122 添加集合点(Insert->Rendezvous) 当一个集合点被插入,VuGen往Vuser脚本中插入一个lr_rendezvou ...