如何实现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获取元素在数组中索引号的方法
Jul 15 Python
Python批量合并有合并单元格的Excel文件详解
Apr 05 Python
python实现扫描日志关键字的示例
Apr 28 Python
Python Socket编程之多线程聊天室
Jul 28 Python
Python中安装easy_install的方法
Nov 18 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
python 读取鼠标点击坐标的实例
Dec 29 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
python selenium循环登陆网站的实现
Nov 04 Python
Python实现新型冠状病毒传播模型及预测代码实例
Feb 05 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 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截取中文字符串的问题
2006/07/12 PHP
一个php作的文本留言本的例子(六)
2006/10/09 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
js正确获取元素样式详解
2009/08/07 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
也说JavaScript中String类的replace函数
2011/09/22 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
登陆成功后自动计算秒数执行跳转
2014/01/23 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
做web开发 先学JavaScript
2014/12/12 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
原生js实现放大镜组件
2021/01/22 Javascript
[04:42]2015国际邀请赛CDEC战队晋级之路
2015/08/13 DOTA
利用python计算windows全盘文件md5值的脚本
2019/07/27 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
python如何从键盘获取输入实例
2020/06/18 Python
计算机操作自荐信
2013/12/07 职场文书
公务员政审单位鉴定材料
2014/05/16 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
springboot拦截器无法注入redisTemplate的解决方法
2021/06/27 Java/Android
Python开发简易五子棋小游戏
2022/05/02 Python