今天我们来说一说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. NYOJ 1073 最大值 (模拟)

    题目链接 输入N个数,M次查询. 每次查询给出一个数x. 要求:每次查询输出前x个数中第i小的数.(i为第i次查询) 你可以假设M <= N,Xi <= Xi+1 <= Xi+2 & ...

  2. HDU 1521 排列组合 (母函数)

    题目链接 Problem Description 有n种物品,并且知道每种物品的数量.要求从中选出m件物品的排列数.例如有两种物品A,B,并且数量都是1,从中选2件物品,则排列有"AB&qu ...

  3. 天梯赛 L2-005 集合相似度 (set容器)

    给定两个整数集合,它们的相似度定义为:Nc/Nt*100%.其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数.你的任务就是计算任意一对给定集合的相似度. 输入格式: 输 ...

  4. 解决爬虫时网站采用gb2312编码所遇到的乱码问题!

    import requests from bs4 import BeautifulSoupall_url = 'http://www.7160.com/qingchunmeinv/' # 请求头 he ...

  5. C++之模板编程

    当我们越来越多的使用C++的特性, 将越来越多的问题和事物抽象成对象时, 我们不难发现:很多对象都具有共性. 比如 数值可以增加.减少:字符串也可以增加减少. 它们的动作是相似的, 只是对象的类型不同 ...

  6. 64_t3

    texlive-dice-svn28501.0-33.fc26.2.noarch.rpm 24-May-2017 15:52 36490 texlive-dichokey-doc-svn17192.0 ...

  7. The algorithm of entropy realization

    近似熵的一种快速实用算法 Pincus提出的近似熵算法中有很多冗余的计算,效率低,速度慢,不利于实际应用,洪波等人在定义的基础上引入二值距离矩阵的概率,提出了一种实用快速的算法. function A ...

  8. Eclipse java项目转换为web项目

    1.打开.project文件,并修改文件, 修改如下: 找到:<natures> </natures>代码段,在代码段中加入如下内容并保存: <nature>org ...

  9. [会装]Hive安装(基于mysql数据库)

    环境信息:Mac 安装步骤: 1. 下载hive组件(我选择的是社区的2.0.1版本) http://apache.mirror.globo.tech/hive/hive-2.0.1/ 2. 下载my ...

  10. PHP安全编程:register_globals的安全性

    如果你还能记起早期Web应用开发中使用C开发CGI程序的话,一定会对繁琐的表单处理深有体会.当PHP的register_globals配置选项打开时,复杂的原始表单处理不复存在,公用变量会自动建立.它 ...