Django DRF版本号的处理

在restful规范中,后端的API中需要体现版本。如果项目比较大,需要些很多的视图类,在每一个类中都写一遍会比较麻烦,所以drf中也支持了全局配置。在每个版本处理的类中还定义了`reverse`方法,他是用来反向生成URL并携带相关的的版本信息用的。

REST_FRAMEWORK = {"DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",  # 处理版本的类的路径"VERSION_PARAM": "version",  # URL参数传参时的key,例如:xxxx?version=v1"ALLOWED_VERSIONS": ["v1", "v2", "v3"],  # 限制支持的版本,None表示无限制"DEFAULT_VERSION": "v1",  # 默认版本
}

一、基于GET传递参数

1、settings.py

REST_FRAMEWORK={"UNAUTHENTICATED_USER": None,"VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里修改,例如改为"v";"DEFAULT_VERSION":"v1", # 默认版本"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}

2、urls.py

urlpatterns = [# path('admin/', admin.site.urls),path('home/', views.HomeView.as_view(),name="hh"),
]

3、views.py

from rest_framework.versioning import   QueryParameterVersioningclass HomeView(APIView):# 传递过程中可以携带版本信息# http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.versionversioning_class = QueryParameterVersioningdef get(self,request):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生产URL:",url)return Response("...")

二、基于路由传递参数

1、urls.py

urlpatterns = [# 下面这两种写法都可以,一种是基于re_path的路由# path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),re_path(r'^api/(?P<version>\w+)/home/',views.HomeView.as_view(),name="hh"),]

2、settings.py

REST_FRAMEWORK={"UNAUTHENTICATED_USER": None,"VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;"DEFAULT_VERSION":"v1", # 默认版本"ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}

3、views.py

from rest_framework.versioning import   URLPathVersioningclass HomeView(APIView):# 传递过程中可以携带版本信息# http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.versionversioning_class = URLPathVersioningdef get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生产URL:",url)return Response("...")

三、基于请求头传递参数

1、urls.py

urlpatterns = [# 基于请求头传递参数path('api/home/', views.HomeView.as_view(), name="hh"),
]

2、views.py 

from rest_framework.versioning import   QueryParameterVersioning,URLPathVersioning,AcceptHeaderVersioningclass HomeView(APIView):versioning_class = AcceptHeaderVersioningdef get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生产URL:",url)return Response("...")

四、在实际项目中,第二种通过URL传递版本号的方式还是比较常用,在使用的时候,可以通过全局配置,在views中就不需要在引入和单独设置了,可以直接使用,案例如下: 

1、settings.py

REST_FRAMEWORK={# 版本号传递全局设置"VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;"DEFAULT_VERSION":"v1", # 默认版本"ALLOWED_VERSIONS":["v1","v2"], #支 持的版本范围"DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
}

2、urls.py

  # 基于URL传递参数path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),

3、views.py

from rest_framework.views import APIView
from rest_framework.response import Responseclass HomeView(APIView):def get(self,request,*args,**kwargs):print(request.version)print(request.versioning_scheme)url = request.versioning_scheme.reverse("hh",request=request)print("反向生产URL:",url)return Response("...")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还记得高中生物书上的莫斯密码吗?利用Python破解摩斯密码的代码示例!

文章目录 前言摩尔斯电码Python实现摩斯密码对照表加密解密测试 完整代码总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Py…

Arduino驱动MLX90614红外温度传感器(温湿度传感器)

目录 1、传感器特性 2、MLX90614发射率补偿方法 3、控制器和传感器连线图 4、驱动程序 MLX90614红外测温模块,通过探测物体红外辐射能量的大小和波长的分布来检测物体的表面温度。红外测温器由光学系统、光电探测器、信号放大器

一文读懂 Linux mmap

文章目录 1.简介2.实现原理3.相关函数4.mmap和常规文件操作的区别5.作用参考文献 1.简介 mmap&#xff08;memory map&#xff09;即内存映射&#xff0c;用于将一个文件或设备映射到进程的地址空间。 实现这样的映射关系后&#xff0c;进程虚拟地址空间中一段内存地址将与文…

TorchScript C++ 自定义运算符 cpucuda

参考 在 C 中注册调度运算符 使用自定义 C 运算符扩展 TorchScript 环境&#xff1a; NVIDIA Driver Version : 545.23.08CUDA Version: 12.1Python Version: 3.11Pytorch Version: 2.1Cmake version : 3.18.1工作目录&#xff1a;workspace/test 一、 C 自定义运算符 创建…

逐字节讲解 Redis 持久化(RDB 和 AOF)的文件格式

前言 相信各位对 Redis 的这两种持久化机制都不陌生&#xff0c;简单来说&#xff0c;RDB 就是对数据的全量备份&#xff0c;AOF 则是增量备份&#xff0c;而从 4.0 版本开始引入了混合方式&#xff0c;以 7.2.3 版本为例&#xff0c;会生成三类文件&#xff1a;RDB、AOF 和记…

2014年5月28日 Go生态洞察:GopherCon 2014大会回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Java面试附答案:掌握关键技能,突破面试难题!

问题&#xff1a;什么是大O表示法&#xff1f;它在Java中的应用是什么&#xff1f; 回答&#xff1a; 大O表示法是一种用来衡量算法复杂度的方法&#xff0c;它描述了算法的时间复杂度和空间复杂度的增长速度。它使用符号O(n)来表示算法的渐进时间复杂度&#xff0c;其中n表示…

如何让Python2与Python3共存

安装 首先分别安装Py2和Py3&#xff0c;我都安装到C盘根目录里了&#xff0c;然后分别将Py2和Py3都配置到系统环境变量中去&#xff1a;C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts; 配置 修改两个版本的可执行文件名字 验证 重新配置一下pip …

Ubuntu删除应用图标

删除用户下的图标 sudo nautilus ~/.local/share/applications删除系统下的图标 sudo nautilus /usr/share/applications

大数据-之LibrA数据库系统告警处理(ALM-25500 KrbServer服务不可用)

告警解释 系统按30秒周期性检测组件KrbServer的服务状态。当检测到组件KrbServer服务异常时产生该告警。 当检测到组件KrbServer服务恢复时告警恢复。 告警属性 告警ID 告警级别 可自动清除 25500 致命 是 告警参数 参数名称 参数含义 ServiceName 产生告警的服务…

解决MySQL中某列数据过长无法入库的问题-Details:data too long for column `xxx` at row 1

问题描述&#xff1a; 我在将轨迹的经纬度转换为字符串入库时&#xff0c;遇到写入问题 Mysql数据入库报错&#xff1a; Caused by:java.long.exception:写入数据库表失败.Details:data too long for column xxx at row 1&#xff0c;我的xxx字段类型是string,在mysql库表中…

加速CI构建,实现高效流水线——CloudBees CI发布工作区缓存功能

加速软件交付流程能够更快接触到客户&#xff0c;获得竞争优势。然而&#xff0c;识别这一过程中存在的瓶颈可能颇具挑战。让我们从审查构建和测试阶段开始着手。例如&#xff0c;当CI作业执行时间较长时&#xff0c;它会延迟开发人员的反馈循环&#xff0c;从而可能导致发布延…

使用Python解析CAN总线

缘起 在新能源车辆的开发和维护中&#xff0c;经常需要对CAN总线数据进行分析。CANOE等总线软件虽然方便&#xff0c;但功能有限&#xff0c;难以满足数据分析的要求。Matlab的Vehicle Network Toolbox可以方便的进行数据解析和分析&#xff0c;它是闭源且收费的。因此&#x…

SpringBoot启动顺序

前言 每次有人问起SpringBoot的启动顺序是不是又来翻博客了&#xff1f;其实只需要稍微查看Spring的源码即可 步骤 SpringBoot的入口org.springframework.boot.SpringApplication#run(String... args), 这里面实现了SpringBoot程序启动的所有步骤 启动事件的顺序可以看监听器…

uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址

前言 最近在开发中需要根据经纬度获取当前位置信息&#xff0c;传递给后端&#xff0c;用来回显显示当前位置 查阅uni-app文档&#xff0c;发现uni.getLocation () 可以获取到经纬度&#xff0c;但是在小程序环境没有地址信息 思考怎么把经纬度换成地址&#xff0c;如果经纬度…

buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮

buildAdmin 的表头上添加一些按钮&#xff0c;并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮&#xff0c;仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 &#xff0c; 添加&#xff0c; 编辑&…

C++ 问题 怎么在C++11标准语法中调用C++20的类

一. 问题 在工作中,因为一个算法功能需要跟别的部门对接,他们提供了该算法的头文件.h,静态库.lib,动态库.dll。但是头文件中使用了C++20才有的新特性,如#include等,而本地使用的vs2015开发环境,只支持C++11标准语法,这种情况下,该怎么把该算法集成到本地项目中呢? …

写单元测试,没你想得那么简单!

前言 单元测试是什么我们就简单介绍一下&#xff1a; 单元测试是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。 接下来是本人对单元测试的理解和实践。里面没有废话&#xff0c;希望每句话能说到你心…

YOLOv8改进实战 | 更换主干网络Backbone(六)之轻量化模型VanillaNet进阶篇

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

每日一题(LeetCode)----链表--分隔链表

每日一题(LeetCode)----链表–分隔链表 1.题目&#xff08;86. 分隔链表&#xff09; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初…