Django:RestFramework之-------版本控制
6.版本控制
- 从URL通过get传参获取版本。
6.1自定义版本控制
from rest_framework.views import APIView
class ParamVersion(object):
def determine_version(self,request,*args,**kwargs):
version = request.query_params.get("version")
return version
class UserView(APIView):
versioning_class = ParamVersion
def get(self,request,*args,**kwargs):
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
6.2内置类版本控制
#方式1:
#settings.py配置
REST_FRAMEWORK = {
#默认版本V1
"DEFAULT_VERSION":"V1",
#允许版本V1,V2
"ALLOWED_VERSIONS":["V1","V2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
from rest_framework.versioning import QueryParameterVersioning
class UserView(APIView):
#版本控制直接等于QueryParameterVersioning类即可,内部封装N多个方法
versioning_class = QueryParameterVersioning
def get(self,request,*args,**kwargs):
#通过request.version可打印版本
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
#方式2:在路经中传参
#键入http://127.0.0.1:8000/api/v1/users/,获取版本 ***最常用
#settings.py配置
REST_FRAMEWORK = {
#控制版本执行的类
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
#默认版本号
"DEFAULT_VERSION":"v1",
#允许版本号
"ALLOWED_VERSIONS":["v1","v2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
#url配置:
urlpatterns = [
url(r'^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view()),
]
#views.py 视图函数使用
from rest_framework.versioning import URLPathVersioning
class UserView(APIView):
#直接等于URLPathVersioning
versioning_class = URLPathVersioning
def get(self,request,*args,**kwargs):
print(request.version)
# version = request.query_params.get("version")
# print(version)
return HttpResponse("用户列表")
6.3版本控制之源码解析:
#老套路dispatch方法,执行initial:
def initial(self, request, *args, **kwargs):
#这两行代码用于处理版本
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme
#request.version获取版本
#request.versioning_scheme获取处理版本对象
#进入determine_version,用于
def determine_version(self, request, *args, **kwargs):
"""
If versioning is being used, then determine any API version for the
incoming request. Returns a two-tuple of (version, versioning_scheme)
"""
if self.versioning_class is None:
return (None, None)
#处理版本类的对象
#versioning_class = api_settings.DEFAULT_VERSIONING_CLASS 或者 自定义
scheme = self.versioning_class()
#第一个参数为调用版本类的determine_version,获取到版本
#第二个参数,返回处理版本对象是哪个?
return (scheme.determine_version(request, *args, **kwargs), scheme
#那么scheme.determine_version(request, *args, **kwargs)如何获得版本,当执行版本类URLPathVersioning(内置的),它会执行如下方法:
def determine_version(self, request, *args, **kwargs):
version = kwargs.get(self.version_param, self.default_version)
if version is None:
version = self.default_version
if not self.is_allowed_version(version):
raise exceptions.NotFound(self.invalid_version_message)
#返回当前版本
return version
6.4内置方法:
#获取版本
print(request.version)
#根据url上name反向获取当前url
#reverse 执行时会把 request.version的得到的版本值 放入kwargs中,并生成url
url = request.versioning_scheme.reverse(viewname='uuu',request=request)
6.5版本总结
不需要自定义:
直接使用:
配置:
REST_FRAMEWORK = {
#控制版本执行的类
"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
#默认版本号
"DEFAULT_VERSION":"v1",
#允许版本号
"ALLOWED_VERSIONS":["v1","v2"],
#URL上标识版本字段
"VERSION_PARAM":"version"
}
路由:
url(r'^(?P<version>[v1|v2]+)/users/$', views.UserView.as_view(),name='uuu'),
视图:
class UserView(APIView):
versioning_class = URLPathVersioning
def get(self,request,*args,**kwargs):
print(request.version)
url = request.versioning_scheme.reverse(viewname='uuu',request=request)
print(url)#http://127.0.0.1:8000/api/v1/users/
return HttpResponse("用户列表")
Django:RestFramework之-------版本控制的更多相关文章
- Django rest-framework框架-版本控制
第一版: from rest_framework.versioning import BaseVersioning class ParamVersion(object): def determine_ ...
- 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器
一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...
- rest-framework之版本控制
rest-framework之版本控制 本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 f ...
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- django restframework
一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...
- Django Restframework 实践(一)
具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...
- django: rest-framework的 分页和过滤
django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...
随机推荐
- python 基础笔记-函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段·. 好处为: 一可以把程序中相对独立的功能模块抽取出来,减少重读代码的编写: 二是将来可以以重复的使用这些功能模块 定义一个函数 ...
- acwing 算法面试、笔试题公开课整理记录
week1 Google KickStart 2019 A轮 讲解视频地址AcWing 549. 训练 tag: 排序 遍历 在线练习地址AcWing 550. 包裹 在线练习地址Ac ...
- mybatis框架的分页功能
需求说明:为用户管理之查询用户列表功能增加分页实现 列表结果按照创建时间降序排列 /** * 需求说明:为用户管理之查询用户列表功能增加分页实现 列表结果按照创建时间降序排列 * @para ...
- sessionId控制单点登陆
1.配置security-context.xml文件 <?xml version="1.0" encoding="UTF-8"?><beans ...
- .Net Core 获取项目所有程序集,排除Microsoft、Nuget下载的
https://www.cnblogs.com/yanglang/p/6866165.html public static List<Assembly> BaiqianAssemblies ...
- django -- ORM实现作者增删改查
前戏 前面我们已经实现了出版社的增删改查,书的增删改查,书和出版社的对应关系.现在来写一下作者的增删改查和书的对应关系,那书和作者有什么关系呢?一个作者可以写多本书,一本书可以有多个作者,所以书和作者 ...
- C# 委托的本质
它本质是一个方法的容器 委托 只是 一件衣服, 在所有将委托做参数的地方 ,首先想到的是放一个对应的方法进来.
- 转载:EM算法的最精辟讲解
机器学习十大算法之一:EM算法.能评得上十大之一,让人听起来觉得挺NB的.什么是NB啊,我们一般说某个人很NB,是因为他能解决一些别人解决不了的问题.神为什么是神,因为神能做很多人做不了的事.那么EM ...
- git中ignore文件配置
在项目中我们有一些文件是不能公开的,或者说是每个人需要单独配置的,那么这个时候使用 git 就不能上传这些文件.此时就需要对 .gitignore 文件进行配置. git 的忽略原则:参考 廖雪峰的g ...
- vue+element table的弹窗组件
在处理表格编辑相关的需求,是需要做一个弹框进行保存的:或者查看表格数据的详细信息时,也是需要做弹窗: 当然 ,这是类似于这样的 ,当然 element 已经帮我们做好 弹窗这一块 主要 我想记录的是 ...