如何实现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的dict,set,list,tuple应用详解
Jul 24 Python
Python中使用PDB库调试程序
Apr 05 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
python re模块findall()函数实例解析
Jan 19 Python
详解python之协程gevent模块
Jun 14 Python
pyqt 多窗口之间的相互调用方法
Jun 19 Python
Python 使用 prettytable 库打印表格美化输出功能
Dec 26 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
Jan 25 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
python-地图可视化组件folium的操作
Dec 14 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/08/27 PHP
php 上传功能实例代码
2010/04/13 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
身份证号码前六位所代表的省,市,区, 以及地区编码下载
2007/04/12 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
Nodejs回调加超时限制两种实现方法
2017/06/09 NodeJs
详解Vue整合axios的实例代码
2017/06/21 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
原生js生成图片验证码
2020/10/11 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
部署Python的框架下的web app的详细教程
2015/04/30 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
python列表list保留顺序去重的实例
2018/12/14 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
工地资料员岗位职责
2013/12/31 职场文书
运动会广播稿20字
2014/02/18 职场文书
暑期培训随笔感言
2014/03/10 职场文书
机关会计岗位职责
2014/04/08 职场文书
电力安全事故反思
2014/04/27 职场文书
国旗下演讲稿
2014/05/08 职场文书
无毒社区工作方案
2014/05/23 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL