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

【DRF框架】版本控制组件的更多相关文章

  1. rest_framework框架——版本控制组件

    API版本控制可以用来在不同的客户端使用不同的行为.REST框架提供了大量不同的版本设计. 版本控制是由传入的客户端请求决定的,并且可基于请求URL,或者基于请求头. rest_framework 当 ...

  2. 前后端分离djangorestframework——版本控制组件

    什么是版本控制 在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版 ...

  3. drf:restful概念,类继承关系,drf请求封装,drf请求流程,版本控制组件,认证组件(token),权限组件

    1.restful规范 resfful规范的概念最重要: 是一套规范,规则,用于程序之间进行数据交换的约定. 他规定了一些协议,对我们感受最直接的就是,以前写增删改查的时候需要些四个视图寒素,rest ...

  4. rest-framework框架——版本

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

  5. 一、restful规范 二、CBV(View)源代码执行流程 三、drf框架安装和简单使用

    一.restful规范 ''' 它是一个规范,面向资源架构 十条规范 1.API与用户的通讯协议,总是使用HTTPs协议,确保了网络传输的安全性 2.域名 --https://api.example. ...

  6. DRF框架简介(第一天)

    1.drf框架全称 djangorestframework 1.如何安装drf框架: pip3 install djangorestframework #drf框架其实就是一个app称之为drf #d ...

  7. DRF的版本、认证、权限

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  8. DRF的版本和认证

    DRF的版本 版本控制是做什么用的, 我们为什么要用 首先我们要知道我们的版本是干嘛用的呢~~大家都知道我们开发项目是有多个版本的~~ 当我们项目越来越更新~版本就越来越多~~我们不可能新的版本出了~ ...

  9. drf 框架

    一. drf简介 drf框架,全程: django-rest framework  ,   rest是插件名字,django插件的名字叫rest,framework是框架的意思 二. 接口 在平时生活 ...

随机推荐

  1. spring 加载属性(properties)文件

    在开发的过程中,配置文件往往就是那些属性(properties)文件,比如使用properties文件配置数据库文件,又如database-config.properties 代码清单:databas ...

  2. Python - Django - 命名 URL 和反向解析 URL

    命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  3. 【sqlalchemy】

    https://www.cnblogs.com/ccorz/p/5711955.html

  4. canvas《砸肉蛋》

    计划今年要自己写几个游戏的demo,先从<砸地鼠>这种简单的入手. 游戏思路 卡通化前端组头像 两种状态(快乐&被砸) 游戏时间1分钟 微信接口,分享最终得分 游戏规则 前端组的肉 ...

  5. jmeter的安装教程

    JMETER安装教程 jmeter的安装教程 1:安装jdk并且配置好环境变量,此处就不做赘述(前面的文档中有) 2:下载jmeter文件和jmeter的插件文件 JMeter:http://jmet ...

  6. Python:实现图片裁剪的两种方式——Pillow和OpenCV

    原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...

  7. 基于libuv的TCP设计(三)

      基于libuv的TCP设计(一) 基于libuv的TCP设计(二)   一.第二版本的libuv_tcp已经基本可以使用.不会出错与崩溃现象,支持几百路客户端同时连接.可是有一缺陷就占用CPU非常 ...

  8. Head First Design Patterns HeadFirst 设计模式

    OO原则是我们的目标,而设计模式是我们的做法. 策略模式 (Strategy) 在软件开发上,一直不变的真理是"change".不管软件设计的多好,一段时间之后,总是要成长与改变, ...

  9. 大数据架构(PB级)

    1.随着互联网快速发展,数据量的快速膨胀,我们日增3000多亿数据量,因此需要针对PB级存储.几百TB的增量数据处理架构设计 2.系统逻辑划分总图: 暂不便透露 3.系统架构图: 4.大数据计算引擎我 ...

  10. PHP中类的继承与方法重写

    php中类的继承与方法重写,欢迎大神补充指点! <?php namespace _1009; class Demo5 { //实例属性 public $product; public $pric ...