1、版本控制是干什么用的,为什么要有版本?

  我们都知道每一个程序都是有版本的。而且版本也会升级从v1升级到v2、v3、v4·····,但是我们不可能因为新版本出现旧版本就不去维护,因为用户有权选择不更新版本。所以我们就需要对版本进行控制,这个DRF也给我们提供了一些封装好的方法。

2、在版本的源码中遨游

  2.1 先看APIView中,有个initial方法

  2.2 点击initial进入,我们可以看到将版本信息version 和 版本控制方案scheme 分别赋值给了request.version 和 request.determine_version.

    self.determine_version 这个方法是找我们自己定义的版本控制类,没有的话就返回(None,None)

  其实这个版本控制方案就是我们配置的版本控制的类,也就是说,APIView通过这个方法初始化了自己提供的组件

  2.3 在rest_framework.versioning里查看版本控制类的方法。

  

3、具体用法

  以URL上携带版本信息为例

  3.1 第一步

    先自定义一个版本控制类

class MyVersion(object):
def determine_version(self, request, *args, **kwargs):
version = request.query_params.get("version")
if not version:
version = 'v1'
return version

自定义一个版本控制类

  3.2 第二部  在配置文件中注册

REST_FRAMEWORK = {
# 这个是默认使用的版本控制类
"DEFAULT_VERSIONING_CLASS": "utils.version.MyVersion", # 这个版本控制类的路径。
# 默认使用的的版本
'DEFAULT_VERSION': 'v1',
# 允许使用的版本
'ALLOWED_VERSIONS': ['v1','v2'],
# 版本使用的参数名称
'VERSION_PARAM': 'version'
}

配置seting.py

  3.3 在url中写路由

# 这个urls 总urls中的
urlpatterns = [
url(r'^version/', include('Version_Demo.urls')) # 这里用了路由分发
]
# 这个urls是Version_Demo的app中的
urlpatterns = [
url(r'^demo/', Version_Demo.as_view()),
]

urls.py

  3.4 试图测试

class Version_Demo(APIView):     # 要继承APIView ,因为version是在APIView中的
def get(self, request):
print(request.version)
if request.version == 'v2':
print(request.version)
return Response('这是v2版本')
return Response('这是v1版本')

试图测试

最新文章

  1. iOS 事件处理之UIResponder简介
  2. linux tar 解压文件时指定文件名
  3. Java位运算经典实例
  4. python 随笔(property & __class__)
  5. linux优先级、性能监控指令
  6. StoreKit framework
  7. 十个最常见的Java字符串问题
  8. ContextLoaderListener作用详解(转)
  9. 年度酷工作---高级数据工程师(公司靠谱,技术强悍,产品牛叉,福利有干货) 关键词:7000万用户、五星级厨师、住房补助 - V2EX
  10. Android Monkey自己主动化測试
  11. ajax的介绍
  12. ORM框架SQLAlchemy与权限管理系统的数据库设计
  13. bzoj2005 NOI2010 方案统计
  14. python day09
  15. Python 练习——计算1-2+3-4...+99
  16. [Python] Python基础字符串
  17. 深入理解java虚拟机---对象的创建过程(八)
  18. 使用docker搭建redis主从模式
  19. Java ssl认证记录
  20. 牛X的规则引擎urule2

热门文章

  1. hdu2022
  2. CentOS7下安装Docker-Compose No module named 'requests.packages.urllib3'
  3. noip2017爆炸记——题解&总结&反省(普及组+提高组)
  4. java之线程池面试题
  5. 【bzoj1299】[LLH邀请赛]巧克力棒 博弈+模拟
  6. C++ 中头文件(.h)和源文件(.cc)的写法简述
  7. android开发里跳过的坑——camera调用setDisplayOrientation设置预览显示旋转无效
  8. 标准C程序设计七---16
  9. Java学习:一 开篇
  10. BZOJ——2096: [Poi2010]Pilots