简单使用

-drf版本控制
  -在setting中配置
'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值)
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
'VERSION_PARAM': 'version' # URL中获取值的key
  -局部使用
versioning_class = URLPathVersioning
  -全局使用
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',

内置的版本控制类

from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning

#基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1
#基于url的正则方式:URLPathVersioning------>/v1/users/
#基于 accept 请求头方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0
#基于主机名方法:HostNameVersioning------>v1.example.com
#基于django路由系统的namespace:NamespaceVersioning------>example.com/v1/users/

局部使用

#在CBV类中加入
versioning_class = URLPathVersioning

全局使用

REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值)
'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
'VERSION_PARAM': 'version' # URL中获取值的key
}

示例

基于正则的方式:

url

from django.conf.urls import url, include
from web.views import TestView urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/test/', TestView.as_view(), name='test'),
]

views.py

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import URLPathVersioning class TestView(APIView):
versioning_class = URLPathVersioning def get(self, request, *args, **kwargs):
# 获取版本
print(request.version)
# 获取版本管理的类
print(request.versioning_scheme) # 反向生成URL
reverse_url = request.versioning_scheme.reverse('test', request=request)
print(reverse_url) return Response('GET请求,响应内容')

  

# 基于django内置,反向生成url
from django.urls import reverse
url2=reverse(viewname='ttt',kwargs={'version':'v2'})
print(url2)

源码分析

#执行determine_version,返回两个值,放到request对象里
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme def determine_version(self, request, *args, **kwargs):
#当配置上版本类之后,就会实例化
if self.versioning_class is None:
return (None, None)
scheme = self.versioning_class()
return (scheme.determine_version(request, *args, **kwargs), scheme)

最新文章

  1. 让Android支持透明状态栏
  2. C语言 时间函数的学习和总结
  3. USACO 5.4 Betsy&#39;s Tour(暴力)
  4. spring mvc 静态资源 404问题
  5. HTML中Meta属性http-equiv=&quot;X-UA-Compatible&quot;详解
  6. Codeforces Round #259 (Div. 2)-D. Little Pony and Harmony Chest
  7. Cypress的开发板的UART接口打印调试信息
  8. Tomcat部署发布JSP应用程序的三种方法 (转)
  9. 老李分享:《Linux Shell脚本攻略》 要点(六)
  10. Rigidbody(刚体) and Collider(碰撞器)
  11. 2017上海QCon之旅总结(上)
  12. 序列化、反序列化(Serializable特性)
  13. e297: write error in swap file
  14. leetcode 155. Min Stack 、232. Implement Queue using Stacks 、225. Implement Stack using Queues
  15. centos7安装sonarqube6.7 代码质量管理平台
  16. Linux下利用backtrace追踪函数调用堆栈以及定位段错误[转]
  17. gpg签名用法
  18. ubuntu安装mxnet GPU版本
  19. PowerDesigner导入SQL脚本
  20. 有界、无界队列对ThreadPoolExcutor执行的影响

热门文章

  1. kafka 单机配置
  2. 学习笔记&lt;4&gt;初步控件布局
  3. oracle 排序 row_number() over(partition by 排序字段)
  4. mysql批量插入,批量更新
  5. 【Redis学习之四】Redis数据类型 string
  6. python之小数据池
  7. numpy文件操作
  8. flask模板应用-javaScript和CSS中jinja2
  9. mysql+servlet+jsp实现数据库的增删改查
  10. localstorage跨域解决方案