python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)
今天我们来说一说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

打开源码看看具体格式:

总结使用:
- 添加setting配置
- 设置路由
- 获取版本
python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)的更多相关文章
- python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作
阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...
- python3开发进阶-Django框架的自带认证功能auth模块和User对象的基本操作
阅读目录 auth模块 User对象 认证进阶 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其 ...
- python3开发进阶-Django框架的中间件的五种用法和逻辑过程
阅读目录 什么是中间件 中间件的执行流程 中间件的逻辑过程 一.什么是中间件? 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围 ...
- python3开发进阶-Django视图(View)的常见用法
阅读目录 简述Django的View(视图) CBV和FBV Request对象和Response对象 Django组件(render,redirect)详解 一.简述Django的View(视图) ...
- python3开发进阶-Django框架中的ORM的常用操作的补充(F查询和Q查询,事务)
阅读目录 F查询和Q查询 事务 一.F查询和Q查询 1.F查询 查询前的准备 class Product(models.Model): name = models.CharField(max_leng ...
- python3开发进阶-Django框架中form的查看校验方法is_valid()的源码,自定义验证方法
form表单的校验方法is_valid() 点开我们发现这个函数里面只有两个方法方法,最终返回True or False 我们点进.is_bound属性,里面判断传输的数据不是空和上传文件不是空 点进 ...
- python3开发进阶-Django框架的起飞加速一(ORM)
阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...
- python3开发进阶-Django框架的Form表单系统和基本操作
阅读目录 什么是Form组件 常用字段和插件 自定义校验的方式 补充进阶 一.什么是Form组件 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标 ...
- python3开发进阶-Django框架学习前的小项目(一个简单的学员管理系统)
''' 自己独立写一个学员管理系统 表结构: 班级表: -id -grade_name 学生表: -id -student_name -grade 关联外键班级表 老师表: -id -teacher_ ...
随机推荐
- zedboard学习记录.3.oled,创建IP
环境:win7 .vivado 2017.4 .zedboard rev.d 首先建立工程. 1.Tools -> Create and Package New IP 2.Create AXI4 ...
- VueJS $refs 在 ElementUI 中遇到的问题
表单验证的时候 $refs 拿不到 暂且是用 $nextTick 解决,具体原因有待研究 假入在 created 中注册时间来验证 validate,那就放在mounted中 或者...注册了 ev ...
- Linux 删除文件后空间不释放【原创】
删除MySQL备份文件后,查找文件所在目录发现文件已经备删除了,但是空间没有释放,还是83% 解决方法: lsof|grep -i delete 发现进程还在,杀掉进程 kill -9 5377 再次 ...
- SyntaxError: Missing parentheses in call to 'print' 这个错误原因是Python版本问题
问题 print "www.baidu.com" Python2 print ("www.baidu.com") Python3 出 ...
- 以应用带动SDN发展(CDN峰会 工信部杨崑)(转)
以应用带动SDN发展(CDN峰会 工信部杨崑) SDNAP推荐:这是在亚太全媒体SDN峰会由工信部研究院秘书长杨崑做的关于SDN的一个演讲,本人认为主讲者通过对整 个信息服务体系的精简归纳总结,剥 ...
- linux 下配置文件目录/etc/sysconfig
/etc/sysconfig/目录详解 2010-06-19 11:12 6693人阅读 评论(1) 收藏 举报 桌面环境debugging防火墙serviceunix语言 /etc/sysconfi ...
- js获取系统时间
//------------------------------------获取系统日期时间 var oDate=new Date(); //alert(oDate.getFullYear());// ...
- hdu 3573(数学+贪心)
Buy Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Deepin 2015 火狐 Firefox安装Flash
1.sudo apt-get install flashplugin-nonfree 2.至Abobe官网下载最新的Linux版本flash安装包,选择.tar.gz类型,下载(https://get ...
- spring_150902_hibernatedaosupport
实体类: package com.spring.model; import javax.persistence.Entity; import javax.persistence.Id; import ...