Django 之 restframework 版本控制的使用以及源码分析
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 版本控制的使用以及源码分析的更多相关文章
- Django框架(十八)—— CBV源码分析、restful规范、restframework框架
目录 CBV源码分析.restful规范.restframework框架 一.CBV源码分析 1.url层的使用CBV 2.as_view方法 3.view方法 4.dispatch方法(可以在视图层 ...
- Django(50)drf异常模块源码分析
异常模块源码入口 APIView类中dispatch方法中的:response = self.handle_exception(exc) 源码分析 我们点击handle_exception跳转,查看该 ...
- Django(48)drf请求模块源码分析
前言 APIView中的dispatch是整个请求生命过程的核心方法,包含了请求模块,权限验证,异常模块和响应模块,我们先来介绍请求模块 请求模块:request对象 源码入口 APIView类中di ...
- Django(49)drf解析模块源码分析
前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...
- Django(51)drf渲染模块源码分析
前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...
- Django中CBV(Class Base Views)模型源码分析
在view文件中编写一个类,并配置好路由 class Test(View): def get(self, request, *args, **kwargs): return HttpResponse( ...
- Django REST framework认证权限和限制 源码分析
1.首先 我们进入这个initial()里面看下他内部是怎么实现的. 2.我们进入里面看到他实现了3个方法,一个认证,权限频率 3.我们首先看下认证组件发生了什么 权限: 啥都没返回,self.per ...
- django Rest Framework----APIView 执行流程 APIView 源码分析
在django—CBV源码分析中,我们是分析的from django.views import View下的执行流程,这篇博客我们介绍django Rest Framework下的APIView的源码 ...
- CBV源码分析+APIVIew源码分析
{drf,resful,apiview,序列化组件,视图组件,认证组件,权限组件,频率组件,解析器,分页器,响应器,URL控制器,版本控制} 一.CBV源码分析准备工作: 新建一个Django项目 写 ...
随机推荐
- selenium--浏览器窗口截图
前戏 在进行web自动化的时候,只有一个报错信息是不行的,往往需要截图来帮助我们来快速的定位问题,试想一下,我们在一个弹框里添加一些数据,点击保存后,然后在操作元素,这时selenium报错,说找不到 ...
- Educational Round 66 题解
作为橙名来水了一发…… 这次题目就比上次良心多了.7题有5题会做. 然而风格仍然很怪异……还是练少了? A 水题.不过一开始没注意细节挂了几发,罚时罚的真痛…… 明显是能除以 $k$ 就除以 $k$, ...
- ZROI 暑期高端峰会 A班 Day3 字符串
FBI Warning:本文含有大量人类的本质之一 后缀树 反正后缀树就是反串的后缀自动机的 Parent 树,就不管了. 然而 SAM 也忘了 好的假装自己会吧--dls 后缀自动机 大概记得,不管 ...
- Spring注解和标签的比较说明
待完善.... xml标签 注解 说明 xml的Spring约束头 @Configuration xml约束头表明这是用于spring的的配置文件 @Configuration注解表情这是用于Spri ...
- USB、UART、SPI等总线速率(转)
1. USB总线 USB1.1: ——-低速模式(low speed):1.5Mbps ——-全速模式(full speed): 12Mbps USB2.0:向下兼容.增加了高速模式,最大速率480M ...
- Keras 中的 verbose 参数
在 fit( ) 和 evaluate( ) 中 都有 verbose 这个参数,但都是表示日志显示的参数. 具体如下: fit( ) 中 的 verbose 参数: verbose:日志显示ver ...
- javascript的立即执行函数
在javascript中有引入立即执行函数的概念,那么什么是立即执行函数呢?立即执行函数又是怎么写的呢?立即执行函数与普通函数有什么区别呢? 先来看看一般的函数: function a(){ var ...
- sqlalchemy 配合bootstrap-table实现后台分页
创建公共的mysql连接函数 def db_session(): db_config='mysql+mysqldb://'+ mysqluser + ':' + mysqlpassword+'@'+m ...
- LOJ2257 SNOI2017 遗失的答案 容斥、高维前缀和
传送门 数字最小公倍数为\(L\)的充分条件是所有数都是\(L\)的约数,而\(10^8\)内最多约数的数的约数也只有\(768\)个.所以我们先暴力找到所有满足是\(L\)的约数.\(G\)的倍数的 ...
- 【转】2019年7月份,阿里最新Java高频面试真题汇总
技术一面(23问)技术二面(3大块)JAVA开发技术面试中可能问到的问题(17问)JAVA方向技术考察点(33快)项目实战(7大块)必会知识(48点)面试小技巧注意事项1. 阿里技术一面 Java I ...