如何实现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中用Spark模块的使用教程
Apr 13 Python
Python3安装Pymongo详细步骤
May 26 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
int在python中的含义以及用法
Jun 27 Python
解决Django中多条件查询的问题
Jul 18 Python
opencv python如何实现图像二值化
Feb 03 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
python向企业微信发送文字和图片消息的示例
Sep 28 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
Nov 28 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 魔术函数使用说明
2010/02/21 PHP
php学习笔记之面向对象编程
2012/12/29 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript工具库代码
2012/03/29 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
Jquery实现自定义弹窗示例
2014/03/12 Javascript
使用forever管理nodejs应用教程
2014/06/03 NodeJs
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
Javascript基础教程之while语句
2015/01/18 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
对python字典过滤条件的实例详解
2019/01/22 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
Django中的FBV和CBV用法详解
2019/09/15 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
英国领先的在线旅游和休闲零售商:lastminute.com
2019/01/23 全球购物
一夜的工作教学反思
2014/02/08 职场文书
质检员岗位职责范本
2015/04/07 职场文书
2015年度房地产工作总结
2015/04/09 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS