【DRF版本控制】
"首先,我们开发的项目会有多个版本.
其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了.
那么,我们就需要对版本进行控制——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.pyREST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning', # 指定使用的版本控制类
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
'VERSION_PARAM': 'version', # 版本使用的参数名称
'DEFAULT_VERSION': 'v1', # 默认使用的版本
}
步骤二
urls.pyfrom django.conf.urls import url
from blog.views import Test01View # 导入视图 urlpatterns = [
# 如下路径形式:
url(r'^(?P<version>[v1|v2]+)/test01', Test01View.as_view()),
]
步骤三
views.pyfrom 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.pyREST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS': 'utils.version.MyVersion', # 指定自定义的版本控制类
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
'VERSION_PARAM': 'version', # 版本使用的参数名称
'DEFAULT_VERSION': 'v1', # 默认使用的版本
}
步骤三
urls.pyfrom blog.views import Test02View # 导入视图 urlpatterns = [
# 如下路径格式
url(r'^test02/$', Test02View.as_view()),
]
步骤四
views.pyfrom 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版本控制】的更多相关文章
- drf版本控制 和django缓存,跨域问题,
drf版本控制 基于url的get传参方式 REST_FRAMEWORK={ # "DEFAULT_AUTHENTICATION_CLASSES":["app01.aut ...
- $Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器&drf版本控制
1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b ...
- Restful API学习Day4 - DRF版本控制和认证
参考文档: Django REST framework基础:版本控制 Django REST framework基础:认证.权限.限制 为什么要有版本? 某些客户端 使用低版本只维护不开发新功能 v1 ...
- drf版本控制 django缓存
drf的版本控制 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersion ...
- Restful framework【第十二篇】版本控制
简单使用 -drf版本控制 -在setting中配置 'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值) 'ALLOWED_VERSIONS' ...
- 【DRF版本】
目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了. 那么 ...
- Django REST Framework(DRF)_第三篇
DRF版本控制 介绍 我们在看APIView源码时可以看到,版本和版本控制类是通过determine_version的返回值获取的 version, scheme = self.determine_v ...
- Python Django-入门到进阶
web应用 Python-web应用 +HTTP协议 +web框架 第二篇:Djangon简介 Diango 框架起步 Python-Django基础 第三篇:路由控制 Python-Django 路 ...
- rest-framework框架——版本
一.DRF版本控制介绍 随着项目更新,版本会越来越多,不能新的版本出现,旧版本就不再使用维护了.因此不同的版本会有不同的处理,且接口会返回不同的信息. API版本控制允许我们在不同的客户端之间更改行为 ...
随机推荐
- Mabitis中的#与$符号区别及用法介绍
这篇文章主要介绍了Mabitis中的 #{}与 ${} 符号区别,需要的朋友可以参考下 一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例 ...
- 题解 CF1064A 【Make a triangle!】
题目传送门 反正数学方法我是不会 那只能模拟了一只连模拟题解都看不懂的哀怨 我的思路大体如下 1.定义3个变量a,b,c并输入 int a,b,c; cin>>a>>b> ...
- 解决报错:ERROR 1005 (HY000): Can't create table 'market.orders' (errno: 150)
1.描述问题: 在这里我新建了两张表(customers_info和orders) 表一:customers_info CREATE TABLE customers_info ( c_num INT( ...
- jQuery捕获
获得内容 - text().html() 以及 val() 三个简单实用的用于 DOM 操作的 jQuery 方法: text() - 设置或返回所选元素的文本内容 html() - 设置或返回所选元 ...
- Linux, Nginx - Deepin linux手动安装nginx和出现的问题
安装步骤 切换至root su 安装依赖库 sudo apt-get install build-essential && sudo apt-get install libtool s ...
- Redis08——Redis五大数据类型 hash
hash Redis中的hash是一个键值对集合 同时又是一个string类型的field和value的映射表,hash特别适合用于存储对象 类似于java里面的Map<String,Objec ...
- mybatis(六):设计模式 - 责任链模式
- Solr与JDK对应版本关系,Tomcat与JDK版本对应关系
最新在部署solrCloud集群,由于自己机器上用的JDK都是JDK1.7的,然后我就从网上下载了最新下载了最先的solr6.6.0和最新的Tomcat9.0,部署了一下,开始报错,提示solr和JD ...
- rancher三节点k8s集群部署例子
rancher三节点k8s集群部署例子 待办 https://rorschachchan.github.io/2019/07/25/使用Rancher2-1部署k8s/
- WLC5520分布式端口(数据口)使用1G模块!
思科WLC5520有两个分布式端口. 在 10G 模式和 1G 模式之间切换•如果在端口 1 上未安装任何内容,则默认情况下主板配置为 10G 模式.因此,要切换到 1G 模式,则必须在端口 1上安 ...