如何实现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中os操作文件及文件路径实例汇总
Jan 15 Python
python分析apache访问日志脚本分享
Feb 26 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
Python学习之用pygal画世界地图实例
Dec 07 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
python 生成图形验证码的方法示例
Nov 11 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
python 字典item与iteritems的区别详解
Apr 25 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 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中的动态调用实例分析
2015/01/07 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
ECMAScript 基础知识
2007/06/29 Javascript
Javascript延迟执行实现方法(setTimeout)
2010/12/30 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
jQuery中[attribute!=value]选择器用法实例
2014/12/31 Javascript
JS特效实现图片自动播放并可控的效果
2015/07/31 Javascript
js带前后翻页的图片切换效果代码分享
2015/09/08 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
微信小程序实现导航栏和内容上下联动功能代码
2020/06/29 Javascript
Python内置的字符串处理函数整理
2013/01/29 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
django admin管理工具自定义时间区间筛选器DateRangeFilter介绍
2020/05/19 Python
python 绘制场景热力图的示例
2020/09/23 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
HTML+CSS3 模仿Windows7 桌面效果
2010/06/17 HTML / CSS
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
生产车间班组长岗位职责
2014/01/06 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
介绍信范文
2015/01/31 职场文书
廉政承诺书范文
2015/04/28 职场文书
未婚证明范本
2015/06/15 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技