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. Pressure on CTRM/ETRM systems to find arbitrage

    https://www.bobsguide.com/guide/news/2019/Jul/22/pressure-on-ctrmetrm-systems-to-find-arbitrage/ For ...

  2. USACO Milk Routing

    洛谷 P3063 [USACO12DEC]牛奶的路由Milk Routing 洛谷传送门 JDOJ 2334: USACO 2012 Dec Silver 3.Milk Routing JDOJ传送门 ...

  3. 小程序开发第一天josn和wxml

    视频中只有app.josn路径还有wxm文本.js中没有调用page.原视频中是可以出来文本内容的. 但是把js调用page以后是可以呈现的 所以疑问点就是为什么以前可以? 1.微信开发工具改了,强制 ...

  4. Codeforces Round #606 (Div. 2) E - Two Fairs(DFS,反向思维)

  5. university-conda

    1.建立环境 conda create -n djx python=3.7 2.激活 conda activate djx 3.退出 conda deactivate 4.查看 conda env l ...

  6. readfile,read,createReadStream函数

    这三个函数使用前都需要引入fs模块(var fs= require(“fs”) ) readfile:读取文件内容的异步函数,readFile方法是将要读取的文件内容完整读入缓存区,再从该缓存区中读取 ...

  7. 【Gamma】Scrum Meeting 8

    前言 会议定点:大运村公寓 会议时间:2019/6/7 会议目的:分配任务,准备宣传 一.任务进度 组员 上周任务进度 下阶段任务 大娃 辅助做好引导录屏 优化辅助模型 二娃 撰写会议博客 撰写会议博 ...

  8. Python【每日一问】19

    问: [基础题]:请解释类方法.静态方法.属性方法[提高题]:有以下几个数字:1.2.3.4.5,能组成多少个互不相同且无重复数字的三位数?都是多少?(代码实现) 答: [基础题]:请解释类方法.静态 ...

  9. mysql5.7报错ERROR 1819解决办法

    MySQL5.6.6版本之后增加了密码强度验证插件validate_password,相关参数设置的较为严格. 使用了该插件会检查设置的密码是否符合当前设置的强度规则,若不满足则拒绝设置.影响的语句和 ...

  10. Jenkins工具学习(一)

    Jenkins的下载及安装 Jenkins下载地址:https://jenkins.io/download/ 下载后的直接解压安装 根据自己的喜好选择一种方式安装: 如果选择推荐安装,会自动下载一些插 ...