"首先,我们开发的项目会有多个版本.

其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了.

那么,我们就需要对版本进行控制——DRF版本控制.

@


源码剖析

DRF视图中的APIView返回的是View类中的view函数,然后调用dispatch方法.

那么,我们来看看dispatch方法都做了些什么:



执行self.initial方法之前是各种赋值,包括request的重新封装赋值.

self.initial方法中有路由的分发,我们再来看下此方法具体都做了些什么:



我们可以看到:

version版本信息赋值给了request.version.

scheme版本控制方案赋值给了request.versioning_scheme.

其实这个版本控制方法就是我们配置的版本控制的类.

也就是说,APIView通过这个方法初始化自己提供的组件.

我们接下来看看rest_framework为我们提供了那些版本控制的方法(在from rest_framework import versioning文件内):



如上,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的信息")

测试效果如下图:




使用自定义的版本控制类

步骤一 创建自定义版本控制类

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的信息")

测试效果如下图:







is ok.



"

【DRF版本控制】的更多相关文章

  1. drf版本控制 和django缓存,跨域问题,

    drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...

  2. $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制

    1  importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...

  3. Restful API学习Day4 - DRF版本控制和认证

    参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...

  4. drf版本控制 django缓存

    drf的版本控制 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersion ...

  5. Restful framework【第十二篇】版本控制

    简单使用 -drf版本控制 -在setting中配置 'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS' ...

  6. 【DRF版本】

    目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了. 那么 ...

  7. Django REST Framework(DRF)_第三篇

    DRF版本控制 介绍 我们在看APIView源码时可以看到,版本和版本控制类是通过determine_version的返回值获取的 version, scheme = self.determine_v ...

  8. Python Django-入门到进阶

    web应用 Python-web应用 +HTTP协议 +web框架 第二篇:Djangon简介 Diango 框架起步 Python-Django基础 第三篇:路由控制 Python-Django 路 ...

  9. rest-framework框架——版本

    一.DRF版本控制介绍 随着项目更新,版本会越来越多,不能新的版本出现,旧版本就不再使用维护了.因此不同的版本会有不同的处理,且接口会返回不同的信息. API版本控制允许我们在不同的客户端之间更改行为 ...

随机推荐

  1. [JSOI2013] 快乐的 JYY - 回文自动机,DFS

    #include <bits/stdc++.h> #define Sigma 30 #define MAXN 500010 #define int long long using name ...

  2. 安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题

    安装postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题 解决办法: 1.安装系统更新补丁KB2533623,下 ...

  3. Session方法

    Session的save()和persist()方法Session的save()方法使一个临时对象转变为持久化对象.它完成以下操作:(1)将临时对象加入到Session缓存中,使其进入持久化状态.(2 ...

  4. 1052 Linked List Sorting (25分)

    题目 1. 思路 使用map存放所有的地址对 使用起始地址遍历map,结果存放在vector中 排序vector 输出vector 2. 注意点 开始的时候起始地址为-1 可能有些节点没有用到,注意排 ...

  5. 题解【AcWing178】第K短路

    题面 经典的 \(\text{A*}\) 算法例题. 我们可以把估价函数 \(f(i)\) 设置成当前点 \(i\) 到终点 \(t\) 的最短距离,这可以建反图使用 \(\text{Dijkstra ...

  6. c#中转义字符\n和\r的区别

    在c#中\n代表换行,\r代表回车,但\r是把后面的字符覆盖前面的,例: "1234\n567" 输出的是 1234 567 "1234\r567"输出的是 5 ...

  7. windows下划分逻辑分区

    运行命令窗口后,我们输入命令"diskpart"回车! 然后我们在DISKPART>后面输入select disk 0 选择我们的硬盘,然后回车!当然如果你电脑上有好几块硬盘 ...

  8. 使用docker布署wordpress

    环境准备 本博客使用docker环境搭建,从而做到布署简单 centos7环境(centos6跑docker要升级内核,也不建议这样做) 在centos7上安装好docker环境docker安装文档 ...

  9. JS高级---函数作为返回值使用拓展,排序

    函数作为返回值使用拓展,排序 排序, 每个文件都有名字,大小,时间,都可以按照某个属性的值进行排序 函数作为返回值 函数作为参数 //排序,每个文件都有名字,大小,时间,都可以按照某个属性的值进行排序 ...

  10. IntelliJ IDEA 2017.3尚硅谷-----断点调试