今天我们来说一说rest framework 中的 版本 操作的详解

首先我们先回顾一下 rest framework的流程:

请求进来走view ,然后view调用视图的dispath函数

为了演示方便我们先来启一个项目:

在settings 中 INSTALLED_APPS 添加 rest_framework ,

在view.py 中创建一个视图类 假使来个课程类吧:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.renderers import JSONRenderer
#只返回JS #,BrowsableAPIRenderer 渲染器正常不用,容易出BUG from django.shortcuts import HttpResponse class CourseView(APIView):
renderer_classes = [JSONRenderer,] #也可以在setting中设置
def get(self,request,*args,**kwargs):
     self.dispath #方便查看源码
return Response('...')

看request

看看initial

我们就返回去看

我们再回去看看下面

点进去看看

我们来配置一个类QueryParameterVersioning

#在视图中引入QueryParameterVersioning
from rest_framework.versioning import QueryParameterVersioning #写到类中
versioning_class = QueryParameterVersioning

这下我们就去看QueryParameterVersioning这个类

我们考虑一个问题,在新的request中怎么找到老的 request!就是新request._request 就可以获得老request,

实质上就是获取url中GET传来的参数

我们再回去继续往下看

综合上面,函数determine_version 是指就是获取url中的version的对应的值,最后再返回!

我们再回去看:

结论就是我们在CourseView类中get方法可以用 request.version 获取版本的值

看下面演示:

在CourseView类中get方法打印一下  request.version

当没传值:

当传值 ?version =v1

在现实开发中,不可能有几百上千的版本,我们如何去限制版本,继续看源码

这是如何操作的,继续看源码

我们发现又是一个配置项

为了演示需要我们在setting中加入

REST_FRAMEWORK={
'ALLOWED_VERSIONS':['v1`,'v2'] #假使这些是允许的版本
}

我们发现不在配置中,就显示不允许这个版本

当然版本参数的名字默认是version,你想换别的名称也是可以的,一样在setting中添加:

REST_FRAMEWORK={
'VERSION_PARAM':‘version’ #参数
‘DEFAULT_VERSION’: ‘v1’, #默认版本
}

这样的话,在url中可以不传版本的值,也可以取到默认版本的值,

在实际开发中,我们不可能每个视图都写成这样,所以我们在setting 中配置

具体格式:

#setting 中配置
REST_FRAMEWORK={
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning'
}

这时候我们又考虑这样一个问题:

我们想体现版本的格式是如下所示,

我们用上面的方法已经无法解决这个问题!我们引入新的知识点:

from rest_framework.versioning import URLPathVersioning

这个URLPathVersioning 是什么?我们来看一下他的源码:

我们来配置一下这个URL:

视图里改一下:

 versioning_class = URLPathVersioning

url也改下:

当然url 也可以 换正则来判断\w+也可以,但要在setting中配置了版本的范围

#url中
urlpatterns = [
url(r'^(?P<version>\w+)/course/$', course.CourseView.as_view()), ]

总结:

上面两个方法哪个比较好呢?当然是第二个,所以以后写版本的话就用 URLPathVersioning

还有在上面演示的url中,我们可以把版本写在分发之前,就不用再分发之后还要重复的写!这也是要注意的地方!

版本写法不知这两种还支持别的方法,但是我们推荐用 URLPathVersioning 最简洁,方便,我们再来了解了解别的版本的方法,来看rest_framework的源码:

from rest_framework.versioning import BaseVersioning

打开源码看看具体格式:

总结使用:

  1. 添加setting配置
  2. 设置路由
  3. 获取版本

python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)的更多相关文章

  1. python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作

    阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...

  2. python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作

    阅读目录 auth模块 User对象 认证进阶 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其 ...

  3. python3开发进阶-Django框架的中间件的五种用法和逻辑过程

    阅读目录 什么是中间件 中间件的执行流程 中间件的逻辑过程 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围 ...

  4. python3开发进阶-Django视图(View)的常见用法

    阅读目录 简述Django的View(视图) CBV和FBV Request对象和Response对象 Django组件(render,redirect)详解 一.简述Django的View(视图) ...

  5. python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)

    阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_leng ...

  6. python3开发进阶-Django框架中form的查看校验方法is_valid()的源码,自定义验证方法

    form表单的校验方法is_valid() 点开我们发现这个函数里面只有两个方法方法,最终返回True or False 我们点进.is_bound属性,里面判断传输的数据不是空和上传文件不是空 点进 ...

  7. python3开发进阶-Django框架的起飞加速一(ORM)

    阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...

  8. python3开发进阶-Django框架的Form表单系统和基本操作

    阅读目录 什么是Form组件 常用字段和插件 自定义校验的方式 补充进阶 一.什么是Form组件 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标 ...

  9. python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)

    ''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...

随机推荐

  1. oozie与mapreduce简单案例

    准备工作  拷贝原来的模板 mkdir oozie-apps cd oozie-apps/ cp -r ../examples/apps/mar-reduce . mv map-reduce mr-w ...

  2. ruby post json

    require 'net/http' require 'json' uri = URI('http://localhost/test1.php') req = Net::HTTP::Post.new ...

  3. 64_p6

    polkit-kde-5.10.1-1.fc26.x86_64.rpm 12-Jun-2017 13:45 84854 polkit-libs-0.113-8.fc26.i686.rpm 13-Apr ...

  4. UVALive 3668 A Funny Stone Game

    题目链接:UVALive - 3668 题目大意为给定n堆石子,每次的操作是选择三个数i<j<=k,从i中拿一枚石子,在j和k中分别放入一枚石子.不能操作者输.求先手是否能赢,若可以,则输 ...

  5. 使用xbee连接地面站和飞控

    Zigbee是一种短距离.低功耗的近距离无线组网通讯技术,主要适用于自动控制和远程控制领域,可以嵌入各种设备. DIGI的ZigBee产品XBee小型但却是一个功能完善的ZigBee收发器(即接收器/ ...

  6. Window文本在Linux中出现的^M问题

    问题:在Windows中写了一个shell脚本在Linux中死活不能运行,怎么也查不出错误,原来是格式问题. 原因:Windows/DOS系统的换行符是/r/n,Unix/Linux系统的换行符是/n ...

  7. C++卷积神经网络实例(一)

    跟着这位博主来学习C++的卷积网络实例,因为作者一直在更新代码,所以新的代码和这位博主的分析有所不同:这位博主写的东西太泛了,没有讲到实质, 可以参考下他分析的类与类之间的关系图.. 前四节:http ...

  8. html5多媒体Video/Audio

    video:    1.常见的视频格式 视频的组成部分:画面.音频.编码格式 视频编码:H.264.theora.VP8(google开源)      2.常见的音频格式     编码:AAC.MP3 ...

  9. Eolinker——代码注入插入随机参数值

    因为目前eolinker的API自动化测试不支持“构造参数”,所以用到随机数时,可使用代码注入的方式来实现 分步指南 示例:“重置密码”接口,每次运行重置的密码要求不重复 再此接口的“代码注入”区域写 ...

  10. [实战]MVC5+EF6+MySql企业网盘实战(18)——文件上传,下载,修改

    写在前面 经过一段时间的秀秀改改,终于把文件上传下载,修改文件夹文件名称的功能实现了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企 ...