前后端分离djangorestframework——版本控制组件
什么是版本控制
在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版本,肯定有用户不会去升级新版本,所以旧版本的软件当然也可以正常使用的
所以,我们要对其做版本控制,多个版本共存
使用DRF的版本控制组件
新建一个drfversion的django项目,现在该目录的settings.py文件里的app添加rest_framework,建一个叫DRF的app,做好对应的路由分发:
创建一个试图类,其中request.version是读DRF的源码所得,version就是版本参数
且还需要在配置文件里配置如下才行:
REST_FRAMEWORK = { "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning", # DRF自带的 "DEFAULT_VERSION": "v1", #默认的版本 "ALLOWED_VERSIONS": "v1, v2", #允许的版本 "VERSION_PARAM": "ver" # url上的关键词,如:/XX?ver=v1 }
启动项目:
默认就是v1版本
访问v2:
访问v3:
version到底是什么,还有通过读源码得到这个versioning_schme,这两个参数是在源码中看到的:
打印试试:
对了,这个versioning_schme就是刚才我们在配置文件里配置那个参数
其实DRF还有很多这种版本控制分发组件,都在versioning模块里:from rest_framework import versioning
一共这么多,看名字就知道大概是什么用法,最后一个就是刚才用到的
自定义版本控制组件
从前面可以得知,就只需要再自定义一个versioning类就可以了
再看DRF自带的versioning,都定义额这个determine_version
且读源码可知,如果自定义一个versioning,那就必须要定义一个这个determine_version方法,注意看我自定义的Myversion没有继承DRF提供的版本控制类
最后就是在settings.py里应用上就行了,就跟django的中间件一样:
view(其实没有作改动):
运行,访问测试:
正常访问,而且打印的结果,这就是我们自定义的versioning
注意:自定义版本控制组件类确实不需要继承DRF自带的BaseVersioning类就可以实现版本控制,我上面代码中继承的是object,当然也可以继承上,效果是一样的,就不展示访问测试页面了
相关代码:
version:
from rest_framework.versioning import BaseVersioning # class MyVersion(BaseVersioning): 可以不继承也行 class MyVersion(object): def determine_version(self, request, *args, **kwargs): version = request.query_params.get('ver', 'v1') return version
url:
from django.contrib import admin from django.urls import path, re_path, include urlpatterns = [ path('admin/', admin.site.urls), re_path(r'test/', include(('DRF.urls'))), ]
from django.urls import path, re_path from DRF.views import DemoView urlpatterns = [ re_path(r'^version/', DemoView.as_view()), ]
view:
from django.shortcuts import render # Create your views here. from rest_framework.views import APIView from rest_framework.views import Response class VersionView(APIView): def get(self, request): print('version', request.version) print('versioning_scheme', request.versioning_scheme) if request.version == 'v1': return Response('v1版本') elif request.version == 'v2': return Response('v2版本') return Response('不存在的版本')
总结:
- 版本控制,需要在配置文件里配置参数
- 自定义版本控制,必须定义determine_version方法,可以不用继承BaseVersioning类
- 获取url的条件参数用request.query_params
前后端分离djangorestframework——版本控制组件的更多相关文章
- 前后端分离djangorestframework—— 在线视频平台接入第三方加密防盗录视频
加密视频 在以后的开发项目中,很可能有做在线视频的,而在线视频就有个问题,因为在线播放,就很有可能视频数据被抓包,如果这个在线视频平台有付费视频的话,这样就会有人做点倒卖视频的生意了,针对这个问题,目 ...
- 前后端分离djangorestframework—— 接入第三方的验证码平台
关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...
- 前后端分离djangorestframework——分页组件
Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用 前后端分离djangorestframework——序列化与反序列化数据 文章里用到的数据,数据库用的my ...
- 前后端分离djangorestframework——路由组件
在文章前后端分离djangorestframework——视图组件 中,见识了DRF的视图组件强大,其实里面那个url也是可以自动生成的,就是这么屌 DefaultRouter urls文件作如下调整 ...
- 前后端分离djangorestframework——视图组件
CBV与FBV CBV之前说过就是在view.py里写视图类,在序列化时用过,FBV就是常用的视图函数,两者的功能都可以实现功能,但是在restful规范方面的话,CBV更方便,FBV还要用reque ...
- 前后端分离djangorestframework——序列化与反序列化数据
我们写好后端的代码,要把数据交给前端的展示的,这个数据以什么类型给前端呢?学到这里,我们已经知道这个数据最好是json字符串才行,因为网络间的传输,只认字符串或者二进制,字符串就是我们的数据,二进制就 ...
- 前后端分离djangorestframework——认证组件
authentication 认证是干嘛的已经不需要多说.而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token 全局认证 先创建一个django项目,项目名为drf ...
- 前后端分离djangorestframework——restful规范
restful现在非常流行,所以很有必要提一下 web服务交互 在浏览器中能看到的每个网站,都是一个web服务.那么我们在提供每个web服务的时候,都需要前后端交互,前后端交互就一定有一些实现方案,我 ...
- 前后端分离djangorestframework——解决跨域请求
跨域 什么是跨域 比如一个链接:http://www.baidu.com(端口默认是80端口), 如果再来一个链接是这样:http://api.baidu.com,这个就算是跨域了(因为域名不同) 再 ...
随机推荐
- selenium缺少chromedriver解决方法
1.安装好selenium,运行一段测试代码: from selenium import webdriver brower = webdriver.Chrome() brower.get('www.b ...
- Use Generic Replacements of 1.X Framework API Classes 用泛型替换Framework 1.X版本的API类
第一章,第一节 用泛型替换Framework 1.X版本的API类. 说起来,我是没接触过Framework 1.X版本的程序,12年毕的业(算算时间也一年多了,依旧一事无成,汗),毕业之后到公司实习 ...
- Go基础系列:struct的导出和暴露问题
struct的导出和暴露问题 关于struct的导出 struct的属性是否被导出,也遵循大小写的原则:首字母大写的被导出,首字母小写的不被导出. 所以: 如果struct名称首字母是小写的,这个st ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page13-20
01 程序集 程序集是包含编译好的.基于.Net Framework的代码逻辑单元.一般来说,在Visual Studio中的一个项目即一个程序集,而一个项目中包含多种不同的代码文件.程序集分为可执行 ...
- μC/OS-II 任务就绪表及任务调度
任务调度 多任务操作系统的核心工作就是任务调度. 所谓调度,就是通过一个算法在多个任务中确定该运行的任务,做这项工作的函数就叫做调度器. μC/OS-II 进行任务调度的思想是 "近似地每时 ...
- iptables实战案例详解-技术流ken
简介 关于iptables的介绍网上有很多的资料,大家可以自己找一些关于iptables的工作原理,以及四表五链的简介,对于学习iptables将会事半功倍.本博文将会例举几个工作中常用的iptabl ...
- 南大算法设计与分析课程OJ答案代码(1)中位数附近2k+1个数、任意两数之和是否等于给定数
问题1 用来测试的,就不说了 问题2:中位数附近2k+1个数 给出一串整型数 a1,a2,...,an 以及一个较小的常数 k,找出这串数的中位数 m 和最接近 m 的小于等于 m 的 k 个数,以及 ...
- 第一册:lesson fifteen。
原文:Your passports,please. A:Are you Swedish? B:No,we are not. We are Danish. A:Are your friends Dani ...
- MHA高可用
MHA(Master High Availability)目前在 MySQL 高可用方面是一个相对成熟的解决方案,它由日本 DeNA 公司 youshimaton(现就职于 Facebook 公司)开 ...
- 使用NetDrive将虚拟机映射到本地磁盘,使用smba映射本地磁盘(替代FileZilla)
使用NetDrive映射到本地磁盘 使用NetDrive软件来替代FileZilla,NetDrive是一个能把FTP空间虚拟成本地硬盘的软件,这样我们就不需要再使用FileZilla来来回拷贝文件了 ...