如何实现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格式化压缩后的JS文件的方法
Mar 05 Python
浅析Python中MySQLdb的事务处理功能
Sep 21 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
python 利用栈和队列模拟递归的过程
May 29 Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
python3 enum模块的应用实例详解
Aug 12 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
新建文件时Pycharm中自动设置头部模板信息的方法
Apr 17 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
如何利用python进行时间序列分析
Aug 04 Python
Python 实现RSA加解密文本文件
Dec 30 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防注入安全代码
2008/04/09 PHP
php批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
ThinkPHP字符串函数及常用函数汇总
2014/07/18 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
JavaScript定义类的几种方式总结
2014/01/06 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
jQuery表格插件datatables用法详解
2020/11/23 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
解决bootstrap导航栏navbar在IE8上存在缺陷的方法
2016/07/01 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python批量读取文件名并写入txt文件中
2020/09/05 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
Python函数的默认参数设计示例详解
2019/12/01 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python从PDF中提取数据的示例
2020/10/30 Python
python 实现图片批量压缩的示例
2020/12/18 Python
python解包用法详解
2021/02/17 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
2015小学新教师个人工作总结
2015/10/14 职场文书
浅谈Python协程asyncio
2021/06/20 Python
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
2021/10/16 Python