三十七、实战演练之接口自动化平台的文件上传
上传文件功能
上传文件功能主要针对需要测试上传文件的接口。原理是,把要测试上传的文件先上传到测试平台,然后把路径写入 用例中,后台真正测试时再将其进行上传。
一、上传文件模型
在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; …...

SpringBoot 结合RabbitMQ与Redis实现商品的并发下单【SpringBoot系列12】
SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 1 项目准备 SpringBoot 整合 RabbitMQ 消息队…...

【python进阶】序列切片还能这么用?切片的强大比你了解的多太多
📚引言 🙋♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,…...

[数据结构]直接插入排序、希尔排序
文章目录排序的概念和运用排序的概念排序运用常见的排序算法常见的排序算法直接插入排序希尔排序性能对比排序的概念和运用 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操…...

CNN、LeNet、AlexNet、VGG、GoogLeNet、RCNN、Fast RCNN、Faster RCNN、YOLO、YOLOv2、SSD等的关系
卷积神经网络的现状1943年美国数学家提出人工智能1949年心理学家建立神经元模型1957年弗兰克提出 感知器人工神经网络模型1980年建立多层感知器模型1984日本学者提出卷积神经网络原始模型神经感知机1998年提出LeNet-5卷积神经网络,并发展了其在音符和字符上的优势20…...

IO-day1-(fscanf、fprintf.........)
作业一、有一个usr.txt的文件,其中存储着用户的账户和密码,格式如下:zhangsan aaaalisi bbbbb空格前面是账户,空格后面是密码,一行一个账户、密码要求如下:从终端获取一个账户名和密码判断是否能够登录成功…...

C++类和对象(上篇)
目录 1.类的定义 2.类的访问限定符及封装 2.1类的访问限定符 2.2封装 3.类的作用域 4.类的实例化 5.类的大小 6.this 指针 1.类的定义 class className {// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号 class为定义类的关键字,Clas…...

解决Xshell无法连接Kali Linux 2020.1(2019.3)版本
使用Xshell远程终端工具连接虚拟机的Kali Linux却提示连接不上原因:Kali Linux默认没有打开SSH远程登录,SSH就是一种网络协议,用于加密的远程登录,所以在没有打开SSH协议之前是无法使用Xshell连接Kali Linux的。解决办法ÿ…...

项目文章 | 缓解高胆固醇血症 ,浒苔多糖如何相助?
文章标题:Polysaccharides from Enteromorpha prolifera alleviate hypercholesterolemia via modulating the gut microbiota and bile acid metabolism 发表期刊:Food & Function 影响因子:6.317 作者单位:福建医科大…...

Linux使用宝塔面板搭建网站,并内网穿透实现公网访问
文章目录前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4.固定http地址5. 配置二级子域名6.创建一个测试页面前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…...

基于深度学习方法与张量方法的图像去噪相关研究
目录 1 研究现状 1.1 基于张量分解的高光谱图像去噪 1.2 基于深度学习的图像去噪算法 1.3 基于深度学习的高光谱去噪 1.4 小结 2 基于深度学习的图像去噪算法 2.1 深度神经网络基本知识 2.2 基于深度学习的图像去噪网络 2.3 稀疏编码 2.3.1 传统稀疏编码 2.3.2 群稀…...