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项目 写 ...
随机推荐
- C语言实现linux之who功能
/* who_test.c */ #include<stdio.h> #include<string.h> #include<getopt.h> #include& ...
- Golang(三)Goroutine原理
前言 最近用到了一些 Golang 异步编程的地方,感觉 Golang 相对于其他语言(如 Java)对多线程编程的支持非常大,使用起来也非常方便.于是决定了解一下 Goroutine 的底层原理. ...
- Sc config http start= disabled
我不小心使用这个命令 Sc config http start= disabled, 现在http服务 无法启动 管理员运行 sc config http start= demand & ne ...
- 重启nova-scheduler服务,报错Login was refused using authentication mechanism AMQPLAIN
问题描述 运行 systemctl restart openstack-nova-scheduler.service 失败,查看日志报错如下: 2019-12-22 14:52:27.426 1513 ...
- MySQL 5.7更改Root密码和Host
MySQL5.7对用户密码管理对更为严格. 为测试方便,需要将root对权限扩大为所有host.具体操作如下: grep 'temporary password' /var/log/mysqld.lo ...
- 解决myeclipse2017 properties中文被Unicode编码
输入:http://propedit.sourceforge.jp/eclipse/updates/ 在线安装插件解决.
- [记录] C# 版本和.NET 版本以及VS版本的对应关系
简单的来说: VS2010 最高用到 .Net Framework4,C# 4.0 VS2015 最高用到 .Net Framework4.6,C# 6.0 VS2017 最高用到 ...
- JSR223 PostProcessor VS BeanShell PostProcessor in JMeter
I would recommend using JSR223 PostProcessor About performance: In JMeter's official user manual, Ab ...
- 阿里云CentOS服务器下安装Golang1.13并配置代理
注:root账户或添加sudo命令运行. 下载到/usr/local位置并解压 cd /usr/local wget https://studygolang.com/dl/golang/go1.13. ...
- 修改host文件加速访问github
修改本地电脑系统 hosts 文件C:\Windows\System32\drivers\etc,直接在最后加入以下代码 192.30.253.112 github.com 192.30.253.11 ...