DRF框架提供的版本控制组件

核心代码:          

version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme

框架自带的模块:    from rest_framework import versioning

在视图中:

1.获取版本号:request.version          

2.获取版本控制的类:request.versioning_scheme

from rest_framework import versioning

from rest_framework import versioning

# 最基础的版本控制类
class BaseVersioning(object)
# 必须重写该方法
def determine_version(self, request, *args, **kwargs): # 基于URL的版本控制类
class URLPathVersioning(BaseVersioning):
"""
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
] GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""

基于BaseVersioning类的版本控制

'''
基于DRF框架的版本控制组件
# my_version.py
'''
from rest_framework import versioning # 基于BaseVersioning类的版本控制
class MyVersion(versioning.BaseVersioning):
default_version = "v1" # 默认的版本
allowed_versions = ['v1','v2'] # 允许的版本
# 继承BaseVersioning必须重写
def determine_version(self, request, *args, **kwargs):
# 获取参数,获取/api/version/test/?version='xxx'的值
version = request.query_params.get('version',self.default_version)
if self.is_allowed_version(version): # 判断版本是否在允许的版本里
return version # 赋值给request.version
return None

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.my_version import MyVersion # Create your views here. class VersionView(APIView):
versioning_class = MyVersion # 局部使用版本控制
def get(self,request):
if request.version: # MyVersion类中determine_version的返回值
return Response("版本测试接口")
else:
return Response("版本不合法")

基于URLPathVersioning类的版本控制

# settings.py
REST_FRAMEWORK = {
'DEFAULT_VERSION': "v1",
'ALLOWED_VERSIONS': ["v1", "v2"],
}
# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import versioning
# Create your views here. class VersionView2(APIView):
versioning_class = versioning.URLPathVersioning # 局部使用版本控制
def get(self,request,version):
print(request.version)
return Response("版本测试接口")
# urls.py
url(r'^api/(?P<version>[v1|v2]+)/',include('VersionDemo.urls')) # 版本控制,基于URLPathVersioning

源码流程

def initial(self, request, *args, **kwargs):
# 1、获取版本号, 返回一个元祖(,)
version, scheme = self.determine_version(request, *args, **kwargs)
# 2、给request追加版本号和versioning_scheme
request.version, request.versioning_scheme = version, scheme def determine_version(self, request, *args, **kwargs):
# 3、查找指定的版本规则
if self.versioning_class is None:
return (None, None)
# 3.1、实例化version对象
scheme = self.versioning_class()
# 3.2、调用对象的类的determine_version方法
return (scheme.determine_version(request, *args, **kwargs), scheme) class QueryParameterVersioning(BaseVersioning):
def determine_version(self, request, *args, **kwargs):
# 4、进入对应版本类调用determine_version方法,获取version
version = kwargs.get(self.version_param, self.default_version) # version_param默认就是version
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
return version

最新文章

  1. AC自动机-算法详解
  2. QSort函数对不同类型数据快速排序浅谈
  3. Android 各层调用的方式
  4. [uwsgi] no request plugin is loaded, you will not be able to manage requests.
  5. Razor 在WebApp 框架的运用
  6. Kindle3与亚马逊
  7. HDU 3999 The order of a Tree 二叉搜索树 BST
  8. MYSQL学习心得
  9. 结合使用 Oracle Database 11g 和 Python
  10. 『安全工具』目录扫描 DirBuster AND 御剑
  11. C#基础笔记1
  12. 初识Windous程序
  13. Ubuntu配置OpenStack 一:主机环境配置以及问题总结
  14. Spider_Man_5.2 の Mongodb_使用
  15. node中定时器, process.nextTick(), setImediate()的区别与联系
  16. python基础——面向对象进阶
  17. C语言第二次作业-----顺序结构
  18. 从零开始学spring cloud(七) -------- Spring Cloud OpenFegin
  19. leetcode-83.删除排序链表中的重复元素
  20. deque--&gt;collections之#双向消息队列

热门文章

  1. 纯java代码对音频采样率进行转换
  2. systemctl service
  3. 【k8s secret token 删掉自动重建】kubernetes secret 和 serviceaccount
  4. mysql函数IFNULL的使用替换递归方法
  5. 同时使用Redis缓存和Google Guava本地缓存注意事项(深拷贝和浅拷贝)
  6. phpstudy 8.0 安装redis并使用,解决phpstudy 8.0直接启用redis使用不了
  7. Linux DNS 服务器配置与管理
  8. R画柱形图和箱线图
  9. 013 Android 实现流水灯功能+自定义控件的样式(可以复用)
  10. [itext]Java生成PDF文件