如何实现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 MD5文件生成码
Jan 12 Python
Python中使用SAX解析xml实例
Nov 21 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
python判断自身是否正在运行的方法
Aug 08 Python
面向对象学习之pygame坦克大战
Sep 11 Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
Python中实现输入一个整数的案例
May 03 Python
python中@contextmanager实例用法
Feb 07 Python
基于PyTorch中view的用法说明
Mar 03 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
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
php常用图片处理类
2016/03/16 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
Javascript 去除数组的重复元素
2010/05/04 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
关于vue编译版本引入的问题的解决
2018/09/17 Javascript
vue如何获取自定义元素属性参数值的方法
2019/05/14 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[17:36]VG战队纪录片
2014/08/21 DOTA
Python isinstance判断对象类型
2008/09/06 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
Python中GeoJson和bokeh-1的使用讲解
2019/01/03 Python
Python unittest装饰器实现原理及代码
2020/09/08 Python
python时间time模块处理大全
2020/10/25 Python
Python爬虫制作翻译程序的示例代码
2021/02/22 Python
在家更换处方镜片:Lensabl
2019/05/01 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
五年级学生评语
2014/04/22 职场文书
党支部三会一课计划
2014/09/24 职场文书
2014年教师工作总结
2014/11/10 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
地陪导游欢迎词
2015/01/26 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
Python基础之元类详解
2021/04/29 Python
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
一文搞懂MySQL索引页结构
2022/02/28 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
2022/05/25 MySQL