如何实现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实现批量检测HTTP服务的状态
Oct 27 Python
Django开发中复选框用法示例
Mar 20 Python
和孩子一起学习python之变量命名规则
May 27 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
Python3 assert断言实现原理解析
Mar 02 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
浅析Python 字符编码与文件处理
Sep 24 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
Python3中最常用的5种线程锁实例总结
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 $_ENV为空的原因分析
2009/06/01 PHP
php实现httpRequest的方法
2015/03/13 PHP
php+html5基于websocket实现聊天室的方法
2015/07/17 PHP
PHP代码重构方法漫谈
2018/04/17 PHP
jQuery插件实现屏蔽单个元素使用户无法点击
2013/04/12 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
JS实现评价的星星功能
2017/08/20 Javascript
vue监听scroll的坑的解决方法
2017/09/07 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
jQuery中$原理实例分析
2018/08/13 jQuery
解决Angular2 router.navigate刷新页面的问题
2018/08/31 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python代理工具mitmproxy使用指南
2019/07/04 Python
Django之模板层的实现代码
2019/09/09 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
python实现井字棋小游戏
2020/03/04 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
HTML5 虚拟键盘出现挡住输入框的解决办法
2017/02/14 HTML / CSS
德国运动营养和健身网上商店:Myprotein.de
2018/07/18 全球购物
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
岗位聘任书范文
2014/03/29 职场文书
婚纱店策划方案
2014/05/22 职场文书
求职信格式要求
2014/05/23 职场文书
学生干部培训方案
2014/06/12 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
2016大一新生军训感言
2015/12/08 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL