如何实现Django Rest framework版本控制


Posted in Python onJuly 25, 2019

前言

首先,我们开发的项目会有多个版本.

其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了.

那么,我们就需要对版本进行控制——DRF版本控制.

源码剖析

DRF视图中的APIView返回的是View类中的view函数,然后调用dispatch方法.

那么,我们来看看dispatch方法都做了些什么:

如何实现Django Rest framework版本控制

执行self.initial方法之前是各种赋值,包括request的重新封装赋值.

self.initial方法中有路由的分发,我们再来看下此方法具体都做了些什么:

如何实现Django Rest framework版本控制

我们可以看到:

==version版本信息赋值给了request.version.==

==scheme版本控制方案赋值给了request.versioning_scheme.==

其实这个版本控制方法就是我们配置的版本控制的类.

也就是说,APIView通过这个方法初始化自己提供的组件.

我们接下来看看rest_framework为我们提供了那些版本控制的方法(在from rest_framework import versioning文件内):

如何实现Django Rest framework版本控制

如上,rest_framework为我们提供的所有版本控制的方法.

下面,我们来看看在URL上携带版本信息的用法.

使用内置的URLPathVersioning类

如上图所有示,URLPathVersioning是在url上携带版本信息的方法.

步骤一 setting.py

REST_FRAMEWORK = {
  'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 指定使用的版本控制类
  'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
  'VERSION_PARAM': 'version', # 版本使用的参数名称
  'DEFAULT_VERSION': 'v1', # 默认使用的版本
}

步骤二 urls.py

from django.conf.urls import url
from blog.views import Test01View # 导入视图

urlpatterns = [
  # 如下路径形式:
  url(r'^(?P<version>[v1|v2]+)/test01', Test01View.as_view()),
]

步骤三 views.py

from rest_framework.views import APIView
from rest_framework.response import Response

class Test01View(APIView):
  def get(self, request, *args, **kwargs):
    print("版本:", kwargs['version'])
    print("版本控制信息:", request.versioning_scheme)
    if request.version == 'v1':
      # 处理版本v1的业务逻辑
      return Response("这是版本v1的信息")
    # 处理版本v2的业务逻辑
    return Response("这是版本v2的信息")

测试效果如下图:

如何实现Django Rest framework版本控制

如何实现Django Rest framework版本控制

使用自定义的版本控制类

步骤一 创建自定义版本控制类

class MyVersion():
  def determine_version(self, request, *args, **kwargs):
    # 返回值是版本号
    # 获取前端传过来的版本号 并且把版本号返回
    version = request.query_params.get('version')
    if not version:
      # 默认为版本v1,否则都为版本v2
      version = 'v1'
    return version

步骤二 setting.py

REST_FRAMEWORK = {
  'DEFAULT_VERSIONING_CLASS': 'utils.version.MyVersion', # 指定自定义的版本控制类
  'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
  'VERSION_PARAM': 'version', # 版本使用的参数名称
  'DEFAULT_VERSION': 'v1', # 默认使用的版本
}

步骤三 urls.py

from blog.views import Test02View # 导入视图

urlpatterns = [
  # 如下路径格式
  url(r'^test02/$', Test02View.as_view()),
]

步骤四 views.py

from rest_framework.views import APIView
from rest_framework.response import Response

class Test02View(APIView):
  def get(self, request):
    print("版本:", request.version)
    print("版本控制信息:", request.versioning_scheme)
    if request.version == 'v2':
      # 处理版本v2的业务逻辑
      return Response("这是版本v2的信息")
    # 处理版本v1的业务逻辑
    return Response("这是版本v1的信息")

测试效果如下图:

如何实现Django Rest framework版本控制

如何实现Django Rest framework版本控制

如何实现Django Rest framework版本控制

is ok.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
Python实现的tab文件操作类分享
Nov 20 Python
详解python里的命名规范
Jul 16 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
python命名空间(namespace)简单介绍
Aug 10 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
opencv3/C++实现视频背景去除建模(BSM)
Dec 11 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
Django重设Admin密码过程解析
Feb 10 Python
python requests使用socks5的例子
Jul 25 #Python
python基于socket进行端口转发实现后门隐藏的示例
Jul 25 #Python
Django实现跨域请求过程详解
Jul 25 #Python
Django Rest framework认证组件详细用法
Jul 25 #Python
Django Rest framework权限的详细用法
Jul 25 #Python
Django Rest framework解析器和渲染器详解
Jul 25 #Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 #Python
You might like
php学习笔记之 函数声明
2011/06/09 PHP
php学习笔记 类的声明与对象实例化
2011/06/13 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
一个页面放2段图片滚动代码出现冲突的问题如何解决
2012/12/21 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
纯JS代码实现隔行变色鼠标移入高亮
2016/11/23 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
webpack处理 css\less\sass 样式的方法
2017/08/21 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
代码详解Vuejs响应式原理
2017/12/20 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
微信小程序单选radio及多选checkbox按钮用法示例
2019/04/30 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
HTML5的结构和语义(3):语义性的块级元素
2008/10/17 HTML / CSS
会计电算化个人自我评价
2013/11/17 职场文书
教师正风肃纪剖析材料
2014/10/20 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
委托书格式范文
2015/01/28 职场文书
医生辞职信范文
2015/03/02 职场文书
董事会决议范本
2015/07/01 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
docker 制作mysql镜像并自动安装
2022/05/20 Servers