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之-------版本控制的更多相关文章

  1. Django rest-framework框架-版本控制

    第一版: from rest_framework.versioning import BaseVersioning class ParamVersion(object): def determine_ ...

  2. 一.rest-framework之版本控制 二、Django缓存 三、跨域问题 四、drf分页器 五、响应器 六、url控制器

    一.rest-framework之版本控制 1.作用 用于版本的控制 2.内置的版本控制 from rest_framework.versioning import QueryParameterVer ...

  3. rest-framework之版本控制

    rest-framework之版本控制 本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 f ...

  4. django restframework serializer 增加自定义字段

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...

  5. django restframework

    一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...

  6. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  7. django restframework 快速入门

    django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...

  8. Django Restframework 实践(一)

    具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...

  9. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

随机推荐

  1. rf增加产品的例子

    Open Browser http://xxx.xxx.xxx.xxx:1000/portal/login/init.htm gcMaximize Browser Window sleep 2 #Ge ...

  2. Anaconda3(2)Anaconda3中安装TensorFlow

    https://zhuanlan.zhihu.com/p/34730661 1. 安装anaconda3:自行下载.安装[注意版本] (可参考引用链接) 2. 搭建TensorFlow环境 cuda1 ...

  3. [PHP] 一个免费、开源的基于tp5+layui2.1.5开发的快速开发框架

    推荐 一个免费.开源的基于tp5+layui2.1.5开发的快速开发框架,既可以用来学习,也可以用来实际项目的快速开发: 码云下载:https://gitee.com/eduaskcms/eduask ...

  4. webpack中的hash、chunkhash、contenthash区别

    hash一般是结合CDN缓存来使用,通过webpack构建之后,生成对应文件名自动带上对应的MD5值.如果文件内容改变的话,那么对应文件哈希值也会改变,对应的HTML引用的URL地址也会改变,触发CD ...

  5. ZROI 暑期高端峰会 A班 Day4 树上数据结构

    FBI Warning:本文含有大量人类的本质之一. 你经历过绝望吗? [ZJOI2007]捉迷藏 询问树上最远黑点对. 动态边分治可以比点分治少一个 \(\log\). bzoj3730 咕了. [ ...

  6. Ajax运用与分页

    目录 django与ajax的分页处理 ajax + sweetAlert 实现再次确认: 批量数据插入 分页: django与ajax的分页处理 ajax + sweetAlert 实现再次确认: ...

  7. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  8. SQL2008R2下数据库修复一例

    某天访问某个数据库的时候,系统报错.连上去看了一下,服务器是SQL2008R2.由于有上次修复的经验,先使用DBCC查看数据库情况. DBCC的返回: XXXXXXXXXXX发生异常数据库 ID 7, ...

  9. Golang(四)正则表达式使用

    0. 前言 最近用到了 regexp 包,下面整理下正则表达式相关用法 参考 基础知识 - Golang 中的正则表达式 和 Golang regexp包中的函数和方法 做了汇总 1. 正则表达式 1 ...

  10. Spring Events

    https://www.baeldung.com/spring-events by Eugen Paraschiv Spring+ I just announced the new Learn Spr ...