如何实现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中的RSS处理
Apr 13 Python
讲解Python中if语句的嵌套用法
May 14 Python
python去除文件中空格、Tab及回车的方法
Apr 12 Python
Python性能提升之延迟初始化
Dec 04 Python
python实现用户答题功能
Jan 17 Python
python递归法解决棋盘分割问题
Jul 17 Python
python匿名函数用法实例分析
Aug 03 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python numpy 矩阵堆叠实例
Jan 17 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
Python Django ORM连表正反操作技巧
Jun 13 Python
python字典的元素访问实例详解
Jul 21 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下使用SimpleXML 处理XML 文件
2010/02/27 PHP
php json_encode奇怪问题说明
2011/09/27 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php提交post数组参数实例分析
2015/12/17 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
原生js和jquery实现图片轮播特效
2015/04/23 Javascript
常见的javascript跨域通信方法
2015/12/31 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
JS实现滚动条触底加载更多
2019/09/19 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
python实现无证书加密解密实例
2014/10/27 Python
Python中的下划线详解
2015/06/24 Python
python+tkinter实现学生管理系统
2019/08/20 Python
python3 assert 断言的使用详解 (区别于python2)
2019/11/27 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python如何把Spark数据写入ElasticSearch
2020/04/18 Python
django 外键创建注意事项说明
2020/05/20 Python
python实现图片,视频人脸识别(dlib版)
2020/11/18 Python
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
汽车制造与装配专业自荐信范文
2014/01/02 职场文书
安全演讲稿大全
2014/05/09 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
任命通知范文
2015/04/21 职场文书
2015年教师节感言
2015/08/03 职场文书
六五普法心得体会2016
2016/01/21 职场文书
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python