三十七、实战演练之接口自动化平台的文件上传
上传文件功能
上传文件功能主要针对需要测试上传文件的接口。原理是,把要测试上传的文件先上传到测试平台,然后把路径写入 用例中,后台真正测试时再将其进行上传。
一、上传文件模型
在testplans/models.py 模块中编写如下模型:
class UploadFile(models.Model):"""文件上传"""file = models.FileField(help_text='文件', verbose_name='文件')info = models.JSONField(help_text='数据', verbose_name='数据', default=list,blank=True)def str (self):return self.file.nameclass Meta:db_table = 'upload_file' verbose_name = ' 文 件 上 传 ' verbose_name_plural = verbose_name
django框架中上传文件可以使用FileField 字段,它保存的是上传文件的路径。
二、文件存储设置
默认情况下,文件上传后保存在MEDIA_ROOT 配置下的路径中。在配置文件中添加如下配置:
MEDIA_ROOT = BASE_DIR / 'upload_files'
然后,在项目根目录创建目录upload_files 。
三、上传文件接口设计
(1)文件上传
接口名称: /upload/
请求方式: POST
参数格式: form表单
请求参数:
| 参数 | 变量名 | 类型 | 说明 | 是否必传 |
| 文件 | file | 文件 | 上传文件 | 是 |
请求示例:
form格式参数
------WebKitFormBoundaryuB0zvJWw5yrFtxuU
Content-Disposition: form-data; name="file"; filename="hahaha.sql"
Content-Type: application/octet-stream
------WebKitFormBoundaryuB0zvJWw5yrFtxuU--
返回示例
响应状态码:201 响应数据:
{"id":7,"info": ["hahaha.sql","D:\\project\\backend\\upload_files\\hahaha.sql","application/octet-stream"]
}
(2)文件删除
接口名称: /upload/pk/
请求方式: DELETE
参数格式: 路径参数
请求参数: 无
返回示例
响应状态码:204 响应数据:无
(3)查看文件列表
接口名称: /upload/
请求方式: GET
参数格式: 无
请求参数:
| 参数 | 变量名 | 类型 | 说明 | 是否必传 |
| 项目id | project | 整数 | 项目id | 否 |
返回示例
响应状态码:200 响应数据:
[{"id": 7,"info": ["hahaha.sql", "D:\\project\\backend\\upload_files\\hahaha.sql", "application/octet-stream"]},{"id": 6,"info": ["hahaha.sql", "D:\\project\\backend\\upload_files\\hahaha.sql", "application/octet-stream"]},{"id": 5,"info": ["hahaha.sql", "D:\\project\\backend\\upload_files\\hahaha.sql", "application/octet-stream"]},
]
(4)查看文件
接口名称: /upload/pk/
请求方式: GET
参数格式: 路径参数
请求参数: 无
返回示例
响应状态码:200
响应数据:
{"id": 7,"info": ["hahaha.sql", "D:\\project\\backend\\upload_files\\hahaha.sql", "application/octet-stream"
]
}
四、后端代码
(1)序列化器
class UploadFileSerializer(serializers.ModelSerializer):"""文件上传序列化器"""class Meta:model = UploadFilefields = '__all__'extra_kwargs = {'file': {'write_only': True}, 'info': {'read_only': True}}
(2)视图
① 限制上传文件的大小、限制重复上传
复写 perform_create,获取文件的大小size和名字name。
前端会把我们这个文件传过来,传过来之后,我们后端通过self.request.data['file'] 就能拿到这个文件,然后下面有个属性size就能拿到他的大小,name拿到他的文件名字。

我们打个断点看下到底是咋实现的。
http://127.0.0.1:8000/upload/ 上传文件


可以看到,他是一个在内存里的uploadfile 一个上传文件,大小是57505,可以看到他的name和size、content_type属性等等。 
判断文件大小,还要判断文件名是否存在(settings.MEDIA_ROOT 这个就是配置文件中的)。
因为上传文件的时候不需要输入参数info,因为你上传的时候还不知道参数info -文件具体参数是啥。所以在序列化器的时候把info设置为read_only = True。

② 删除本地保存的文件
先看下父类的 perform_destroy 是咋实现的。
调用instance.delete()之前先去删除本地保存的文件

具体代码附上:
class UploadFileViewSet(ModelViewSet):"""文件上传视图"""queryset = UploadFile.objects.all()serializer_class = UploadFileSerializerpermission_classes = [IsAuthenticated]def perform_create(self, serializer):# 限制文件大小,文件重复# 生成info数据size = self.request.data['file'].sizename = self.request.data['file'].nameif size > 1024 * 300:raise ValidationError(detail='上传的文件大小不可超过300KB')if os.path.isfile(settings.MEDIA_ROOT / name):raise ValidationError(detail=f'文件【{name}】已存在')file_type = self.request.data['file'].content_typefile_path = str(settings.MEDIA_ROOT / name)info = [name, file_path, file_type]serializer.save(info=info)def perform_destroy(self, instance):"""文件删除"""# 删除本地保存的文件os.remove(instance.file.path)instance.delete()
(3)路由
from rest_framework.routers import DefaultRouterfrom . import viewsrouter = DefaultRouter()
router.register('upload', views.UploadFileViewSet)urlpatterns = router.urls
相关文章:
三十七、实战演练之接口自动化平台的文件上传
上传文件功能 上传文件功能主要针对需要测试上传文件的接口。原理是,把要测试上传的文件先上传到测试平台,然后把路径写入 用例中,后台真正测试时再将其进行上传。 一、上传文件模型 在testplans/models.py 模块中编写如下模型:…...
菜鸟刷题Day1
菜鸟刷题Day1 一.自守数:自守数_牛客题霸_牛客网 (nowcoder.com) 描述 自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 625,76^2 5776,9376^2 87909376。请求出n(包括n)以内的自守数的个数 解题思路&#x…...
cjson文件格式介绍
cjson是一种轻量级的JSON解析库,它支持将JSON格式的数据转换为C语言中的数据结构,同时也支持将C语言中的数据结构转换为JSON格式的数据。cjson的文件格式是指在使用cjson库时,将JSON格式的数据存储在文件中,然后通过cjson库读取文…...
【Nginx二】——Nginx常用命令 配置文件
Nginx常用命令 配置文件常用命令启动和重启 Nginx配置文件maineventshttp常用命令 安装完成nginx后,输入 nginx -?查询nginx命令行参数 nginx version: nginx/1.22.1 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix][-e filename] [-c filename] [-…...
3月最新!AIGC公司生态地图;开发者实用ChatGPT工具清单;上手必会的SD绘图教程;字幕组全自动化流程大公开 | ShowMeAI日报
👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『光年之外诚邀产品经理加入』古典产品经理的复兴! 光年之外创始人王慧文在社交平台发帖,公布联合创始人团队基…...
python - 递归函数
递归函数 什么是递归 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数 递归函数必须有一个明确的结束条件每进入更深一层的递归时,问题规模相对于上一次递归都应减少相邻两次重复之间有紧密的联系&…...
ring_log环形日志-6M缓冲区_proc接口
文章目录log_tools.clog.cspin_lockseq_putsseq_readseq_writesingle_openmakefiletest.sh测试:运行./test.sh读取日志插入日志echo cat测试参考:log_tools.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #includ…...
Linux内核进程管理几种CPU调度策略
CPU调度我们知道,程序需要获得CPU的资源才能被调度和执行,那么当一个进程由于某种原因放弃CPU然后进入阻塞状态,下一个获得CPU资源去被调度执行的进程会是谁呢?下图中,进程1因为阻塞放弃CPU资源,此时&#…...
SpringBoot整合Flink(施耐德PLC物联网信息采集)
SpringBoot整合Flink(施耐德PLC物联网信息采集)Linux环境安装kafka前情:施耐德PLC设备(TM200C16R)设置好信息采集程序,连接局域网,SpringBoot订阅MQTT主题,消息转至kafka,…...
DFS(深度优先搜索)和BFS(宽度优先搜索)
目录 DFS(深度优先搜索) 全排列的DFS解法 利用DFS递归构建二进制串和递归树的结构剖析 DFS--剪枝 DFS例题--整数划分 BFS(宽度优先搜索) 全排列的BFS解法 DFS(深度优先搜索) 深度优先搜索(Depth First Search&…...
Redis缓存穿透、击穿、雪崩问题及解决方法
系列文章目录 Spring Cache的使用–快速上手篇 分页查询–Java项目实战篇 全局异常处理–Java实战项目篇 完善登录功能–过滤器的使用 上述只是部分文章,对该系列文章感兴趣的可以查看我的主页哦 文章目录系列文章目录前言一、缓存穿透1.1 问题引入1.2 解决方法1.…...
HAL库 STM32 串口通信
一、实验条件将STM32的PA9复用为串口1的TX,PA10复用为串口1的RX。STM32芯片的输出TX和接收RX与CH340的接收RX和发送TX相连(收发交叉且PCB上默认没有相连,所以需要用P3跳线帽进行手动连接),CH340的另一端通过USB口引出与…...
2023-第十四届蓝桥杯冲刺计划!
💬前言 💡本文以目录形式列举大纲,可根据题目点击跳转 🌈冲刺阶段目的:把握高频重点,结合基础算法和常考题型总结,用真题进行模拟练习 根据自己的能力熟练目前已掌握的算法,不会的还可以暴力 ⏳最后三个星期大家一起冲…...
内网渗透基础知识
一、内网概述 内网也指局域网,是指在某一区域内又多台计算机互联成的计算机组。一般是方圆几千米内,局域网可以实现文件管理,应用软件共享,打印机共享,工作组内的历程安排,电子邮件和传真通信服务等功能。…...
鸟哥的Linux私房菜 正则表示法与文件格式化处理
第十一章、正则表示法与文件格式化处理 https://linux.vbird.org/linux_basic/centos7/0330regularex.php 简体版 http://cn.linux.vbird.org/linux_basic/0330regularex.php 11.2.2 grep的一些高级选项 例题一、搜索特定字符串 例题二、利用中括号 [] 来搜寻集合字符 例题四…...
1630.等差子数组
1630. 等差子数组 难度中等 如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , s[i1] - s[i] …...
CSS 属性计算过程
CSS 属性计算过程 你是否了解 CSS 的属性计算过程呢? 有的同学可能会讲,CSS属性我倒是知道,例如: p{color : red; }上面的 CSS 代码中,p 是元素选择器,color 就是其中的一个 CSS 属性。 但是要说 CSS 属…...
ThinkPHP02:路由
ThinkPHP02:路由一、路由定义二、变量规则三、路由地址四、路由参数五、路由分组六、MISS七、资源路由八、注解路由九、URL生成一、路由定义 路由默认开启,在 config/app.php 中可以关闭路由。 路由配置在 config/route.php 中,路由定义在 r…...
制作简单进销存管理系统(C#)
实验三:制作简单进销存管理系统 任务要求: 在进销存管理系统中,商品的库存信息有很多种类,比如商品型号、商品名称、商品库存量等。在面向对象编程中,这些商品的信息可以存储到属性中,然后当需要使用这些…...
css总结9(过渡和2D变换)
目录 过渡 2D变换 3D变换 过渡 属性结构图 过渡补充 ### 过渡多个元素样式属性 transition:style1 duration , style2 duration,...; ### 过渡所有属性 transition: all duration; 简单示例 ### 移入时改变长度且加入过渡效果 div { width:100px; height:100px; …...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
