前后端分离djangorestframework——版本控制组件
什么是版本控制
在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版本,肯定有用户不会去升级新版本,所以旧版本的软件当然也可以正常使用的
所以,我们要对其做版本控制,多个版本共存
使用DRF的版本控制组件
新建一个drfversion的django项目,现在该目录的settings.py文件里的app添加rest_framework,建一个叫DRF的app,做好对应的路由分发:
创建一个试图类,其中request.version是读DRF的源码所得,version就是版本参数
且还需要在配置文件里配置如下才行:
1 2 3 4 5 6 | 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】