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_ ...
随机推荐
- HDU 1172 猜数字 (模拟)
题目链接 Problem Description 猜数字游戏是gameboy最喜欢的游戏之一.游戏的规则是这样的:计算机随机产生一个四位数,然后玩家猜这个四位数是什么.每猜一个数,计算机都会告诉玩家猜 ...
- html5优分期大学生分期购物商城模板
链接:http://pan.baidu.com/s/1dEUAzBz 密码:j150
- 四. Jmeter--JDBC 请求
一, SQLserver 1.下载 JDBC Driver (sqljdbc_6.0.8112.100_enu.exe) https://www.microsoft.com/en-us/downlo ...
- android 系统的休眠与唤醒+linux 系统休眠
Android休眠与唤醒驱动流程分析 标准Linux休眠过程: powermanagement notifiers are executed with PM_SUSPEND_PREPARE tasks ...
- 全面了解 Nginx 主要应用场景
前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...
- 程序调试命令gdb
锁定线程 set scheduler-locking 1.要使用此命令,先用gcc -g编译程序,如: $gcc -g test.c -o test 编译test.c源程序,输入此程序的调试版本t ...
- nginx location 指令意义
基本语法:location [=|~|~*|^~] /uri/ { … } = 严格匹配.如果这个查询匹配,那么将停止搜索并立即处理此请求.~ 为区分大小写匹配(可用正则表达式)!~为区分大小写不匹配 ...
- oracle 一个网站
http://www.oracle.com/technetwork/cn/articles/11g-pivot-101924-zhs.html
- Percona XtraDB Cluster(PXC) -集群环境安装
Percona XtraDB Cluster(PXC) ---服务安装篇 1.测试环境搭建: Ip 角色 OS PXC-version 172.16.40.201 Node1 Redhat/C ...
- HDU 2822
Dogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...