如何实现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学习之asyncore模块用法实例教程
Sep 29 Python
python单例模式实例分析
Apr 08 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
python去掉行尾的换行符方法
Jan 04 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
Python找出微信上删除你好友的人脚本写法
Nov 01 Python
Python 3.8中实现functools.cached_property功能
May 29 Python
Python之数据序列化(json、pickle、shelve)详解
Aug 30 Python
python应用文件读取与登录注册功能
Sep 23 Python
使用Python进行防病毒免杀解析
Dec 13 Python
python中怎么表示空值
Jun 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
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
文件上传程序的全部源码
2006/10/09 PHP
php中get_object_vars()方法用法实例
2015/02/08 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
javascript下function声明一些小结
2007/12/28 Javascript
Javascript学习笔记1 数据类型
2010/01/11 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
JavaScript DOM操作表格及样式
2015/04/13 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
Vue和React组件之间的传值方式详解
2019/01/31 Javascript
详解iframe跨域的几种常用方法(小结)
2019/04/29 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Python基于回溯法子集树模板解决最佳作业调度问题示例
2017/09/08 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
python生成器推导式用法简单示例
2019/10/08 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
Django models文件模型变更错误解决
2020/05/11 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
世界上最大的二手相机店:KEN
2017/05/17 全球购物
市场安全管理制度
2014/01/26 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
争做文明公民倡议书
2014/08/29 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
无线电知识基础入门篇
2022/02/18 无线电
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js