如何实现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 相关文章推荐
从零学python系列之从文件读取和保存数据
May 23 Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python基础教程之tcp socket编程详解及简单实例
Feb 23 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python pygorithm模块用法示例【常见算法测试】
Aug 16 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python函数修饰符@的使用方法解析
Sep 02 Python
python3获取url文件大小示例代码
Sep 18 Python
Python修改DBF文件指定列
Dec 19 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
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
AlertBox 弹出层信息提示框效果实现步骤
2010/10/11 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
2014/05/11 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
ES6中字符串的使用方法扩展
2019/06/04 Javascript
javascript中的this作用域详解
2019/07/15 Javascript
小程序如何在不同设备上自适应生成海报的实现方法
2019/08/20 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
[00:43]TI7不朽珍藏III——幽鬼不朽展示
2017/07/15 DOTA
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
计算机专业自荐信
2013/10/14 职场文书
有个性的自我评价范文
2013/11/15 职场文书
文案策划求职信
2014/04/14 职场文书
2014年小学图书室工作总结
2014/12/09 职场文书
地雷战观后感
2015/06/09 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
2022年四月新番
2022/03/15 日漫