今天我们来说一说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. HDU 1172 猜数字 (模拟)

    题目链接 Problem Description 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么.每猜一个数,计算机都会告诉玩家猜 ...

  2. html5优分期大学生分期购物商城模板

    链接:http://pan.baidu.com/s/1dEUAzBz 密码:j150

  3. 四. Jmeter--JDBC 请求

    一,  SQLserver 1.下载 JDBC Driver (sqljdbc_6.0.8112.100_enu.exe) https://www.microsoft.com/en-us/downlo ...

  4. android 系统的休眠与唤醒+linux 系统休眠

    Android休眠与唤醒驱动流程分析 标准Linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasks ...

  5. 全面了解 Nginx 主要应用场景

    前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...

  6. 程序调试命令gdb

    锁定线程 set scheduler-locking 1.要使用此命令,先用gcc -g编译程序,如:  $gcc -g test.c -o test  编译test.c源程序,输入此程序的调试版本t ...

  7. nginx location 指令意义

    基本语法:location [=|~|~*|^~] /uri/ { … } = 严格匹配.如果这个查询匹配,那么将停止搜索并立即处理此请求.~ 为区分大小写匹配(可用正则表达式)!~为区分大小写不匹配 ...

  8. oracle 一个网站

    http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html

  9. Percona XtraDB Cluster(PXC) -集群环境安装

    Percona XtraDB Cluster(PXC)   ---服务安装篇   1.测试环境搭建: Ip 角色 OS PXC-version 172.16.40.201 Node1 Redhat/C ...

  10. HDU 2822

    Dogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...