如何实现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实现遍历数据库并获取key的值
May 17 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
python 调用钉钉机器人的方法
Feb 20 Python
django 自定义过滤器的实现
Feb 26 Python
快速排序的四种python实现(推荐)
Apr 03 Python
Python中遍历列表的方法总结
Jun 27 Python
学Python 3的理由和必要性
Nov 19 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
python和JavaScript哪个容易上手
Jun 23 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
php使用qr生成二维码的示例分享
2014/01/20 PHP
php实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
js实现右键菜单功能
2016/11/28 Javascript
JS敏感词过滤代码
2016/12/23 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
2018/03/22 Javascript
vue中使用iview自定义验证关键词输入框问题及解决方法
2018/03/26 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
Python中文件操作简明介绍
2015/04/13 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python使用QQ邮箱发送Email的方法实例
2017/02/09 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
我们的节日端午节活动方案
2014/03/02 职场文书
英语教研活动总结
2014/07/02 职场文书
体育教师个人总结
2015/02/09 职场文书
检讨书怎么写
2015/05/07 职场文书