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_ ...
随机推荐
- 【leetcode 简单】第三题 回文数
判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...
- NYOJ 267 郁闷的C小加(二) (字符串处理)
题目链接 描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考"郁闷的C小加(一)"),C小加很高兴.但C小加是个爱思考的人,他又想通过这种方法计算一个表达式的值 ...
- Xcode 获取本地IP
// // // #define MAXADDRS 32 extern char *ip_names[MAXADDRS]; void InitAddresses(); void GetIPAddres ...
- 全文搜索引擎 Elasticsearch 介绍
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选. 它可以快速地储存.搜索和分析海量数据.维基百科.Stack Overflow.Gi ...
- 深入理解Spring系列之三:BeanFactory解析
转载 https://mp.weixin.qq.com/s?__biz=MzI0NjUxNTY5Nw==&mid=2247483824&idx=1&sn=9b7c2603093 ...
- 贪心算法_01背包问题_Java实现
原文地址:http://blog.csdn.net/ljmingcom304/article/details/50310789 本文出自:[梁敬明的博客] 1.贪心算法 什么是贪心算法?是指在对问题进 ...
- Mysql 主主复制失败恢复【转】
Mysql 主主复制失败 Mysql 主主复制失败 故障描述 架构信息 节点信息 故障分析 同步AIPPRD2的从环境 同步AIPPRD1的从环境 故障描述 原因描述 因为机柜PDU老化, 导致整个机 ...
- Eloquent中一些其他的create方法
firstOrCreate/ firstOrNew# 还有两种其它方法,你可以用来通过属性批量赋值创建你的模型:firstOrCreate 和firstOrNew.firstOrCreate 方法将会 ...
- laravel入门教程
参考地址:https://github.com/johnlui/Learn-Laravel-5/issues/16
- 创建 dblink
目的:oracle中跨数据库查询 两台数据库服务器db_A(本地)和db_B(远程192.168.1.100),db_A下用户user_a 需要访问到db_B下user_b的数据解决:查询 ...