Django rest_framework 之 版本控制

一、何为版本控制:

​ 用于版本的控制

二、内置的版本控制类:

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/

三、局部使用

  • 先导入模块

    from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning
  • 在视图类中写入配置

    #在CBV类中加入
    versioning_class = URLPathVersioning # 基于url的正则方式:URLPathVersioning--->/v1/users/
  • 在settings.py 中配置 REST_FRAMEWORK

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

四、全局使用(一般都是全局配置)

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

五、示例

urls.py

from django.conf.urls import url, include
from django.contrib import admin
from app01 import views
from rest_framework import routers # 路由控制器 # 生成一个路由控制类的对象
router = routers.DefaultRouter()
# router=routers.SimpleRouter()
# 调用对象的register 方法,传入两个参数 ,第一个匹配的路由,视图中写的cbv类
router.register('books', views.BooksView)
# 带版本号的自动配置路由方法
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'(?P<version>[v1|v2]+)/', include(router.urls))
]

serializers.py(序列化模型类)

class BookSerializer(ModelSerializer):
class Meta:
# 指定模型表
model = models.Book
# 指定需要序列化的字段
fields = "__all__"
# depth = 1 # 控制跨表深度

views.py

from rest_framework.versioning import URLPathVersioning
from rest_framework.response import Response class BooksView(ModelViewSet):
# 局部使用 版本控制 URLPathVersioning
versioning_class = URLPathVersioning
queryset = models.Book.objects.all()
serializer_class = myser.BookSerializer def list(self,request,*args,**kwargs):
print(1)
print(request.version) # 获取版本号 return super().list(request,*args,**kwargs)

六、源码分析

#执行determine_version,返回两个值,放到version,scheme 中
# 其中 version 为版本号
# 其中 scheme 为版本控制的方式类型 (上面的示例类型为 URLPathVersioning)
version, scheme = self.determine_version(request, *args, **kwargs)
# 将版本号 和类型 存放到 request.version 和 request.version_scheme 中
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)

Django 之 restframework 版本控制的使用以及源码分析的更多相关文章

  1. Django框架(十八)—— CBV源码分析、restful规范、restframework框架

    目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...

  2. Django(50)drf异常模块源码分析

    异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...

  3. Django(48)drf请求模块源码分析

    前言 APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块 请求模块:request对象 源码入口 APIView类中di ...

  4. Django(49)drf解析模块源码分析

    前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...

  5. Django(51)drf渲染模块源码分析

    前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...

  6. Django中CBV(Class Base Views)模型源码分析

    在view文件中编写一个类,并配置好路由 class Test(View): def get(self, request, *args, **kwargs): return HttpResponse( ...

  7. Django REST framework认证权限和限制 源码分析

    1.首先 我们进入这个initial()里面看下他内部是怎么实现的. 2.我们进入里面看到他实现了3个方法,一个认证,权限频率 3.我们首先看下认证组件发生了什么 权限: 啥都没返回,self.per ...

  8. django Rest Framework----APIView 执行流程 APIView 源码分析

    在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...

  9. CBV源码分析+APIVIew源码分析

    {drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...

随机推荐

  1. selenium--多窗口操作

    前戏 想一想,我们为什么要获取窗口句柄呢?有什么用呢? 来假设一下,我们打开了一个网站,点击了一个按钮,新打开了一个页面,我们在新页面操作完成之后,需要回到原来的页面继续操作,这时候你如果继续操作原来 ...

  2. vue+element 表单验证

    效果图 <template> <div class="formValidator"> <div v-for="(item,index) in ...

  3. JVM系列之一:JVM架构

    1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...

  4. 对C++11中的`移动语义`与`右值引用`的介绍与讨论

    本文主要介绍了C++11中的移动语义与右值引用, 并且对其中的一些坑做了深入的讨论. 在正式介绍这部分内容之前, 我们先介绍一下rule of three/five原则, 与copy-and-swap ...

  5. Failed to contact the endpoint at http://controller:35357/ for discovery. Fallback to using that endpoint as the base url.

    问题描述 openstack安装过程中,执行 openstack domain create --description "Domain" example 报错如下: Failed ...

  6. Linux 系统开机时间及当前时间

    最近一次系统开机时间:date -d "$(awk -F. '{print $1}' /proc/uptime) second ago" +"%Y-%m-%d %H:%M ...

  7. sbt 安装

    此次安装实在windows 下进行的 1.官网下载sbt 2.安装并配置环境变量 path  中添加: 3.更改sbt配置文件 1)修改C:\notos\software\sbt\conf\sbtco ...

  8. Docker 一步搞定 ZooKeeper 集群的搭建

    Docker 一步搞定 ZooKeeper 集群的搭建 背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 ...

  9. SQL Server创建、更改和删除架构

    SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...

  10. 模拟 + 暴搜 --- Help Me with the Game

    Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3175   Accepted: ...