【pyhton】Sanic框架的文件上传功能开发实战

2024-08-26 10:28

本文主要是介绍【pyhton】Sanic框架的文件上传功能开发实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Sanic框架的文件上传
    • 环境准备
    • 基本概念
    • 文件上传示例
      • 1. 创建Sanic应用
      • 2. 客户端上传文件
        • 使用Postman
        • 使用Python requests库
    • 文件上传的进阶用法
      • 3. 验证上传文件的类型
      • 4. 安全性考虑
      • 5. 进度反馈
      • 6. 异步文件处理
      • 7. 监控和日志
    • 总结

Sanic框架的文件上传

Sanic是一个Python 3.5+的异步Web框架,它的设计理念与Flask相似,但采用了更高效的异步I/O处理。在处理文件上传时,Sanic同样提供了方便、高效的方法。本教程将结合实际案例,详细介绍如何在Sanic框架中实现文件上传的功能。

环境准备

在开始之前,请确保你已经安装了Python 3.5或更高版本,并安装了Sanic框架。如果没有安装Sanic,可以通过pip命令进行安装:

pip install sanic

基本概念

在Sanic中,文件上传通常是通过request.files属性来实现的。当客户端以multipart/form-data的方式发送POST请求时,可以通过request.files.get('filename')来获取指定的文件对象。

文件上传示例

1. 创建Sanic应用

首先,我们需要创建一个Sanic应用实例,并定义一个用于文件上传的路由。
首先创建个文件上传的目录
在这里插入图片描述
代码展示:

from sanic import Sanic
from sanic.response import jsonapp = Sanic("File-Upload-Example")@app.route("/upload", methods=["POST"])
async def handle_upload(request):# 获取上传的文件,根据请求体中file字段获取上传的文件#先打印file对象print("files对象",request.files)file = request.files.get('file')# print("获取的文件对象名",file.name)print("查看file有哪些方法",dir(file))if file:# 对文件进行处理,这里简单地将文件保存到本地file_path = './uploads/' + file.namewith open(file_path, 'wb') as f:#上传的文件在file的body中f.write(file.body)return json({"message": "File uploaded successfully", "filename": file.name})else:return json({"error": "No file uploaded"}, status=400)if __name__ == "__main__":app.run(host="0.0.0.0", port=8000)

2. 客户端上传文件

为了测试文件上传功能,我们需要一个客户端来发送文件。可以使用Postman这样的工具,或者使用Python的requests库来发送请求。

使用Postman
  1. 打开Postman,创建一个新的POST请求。
  2. 在请求URL中输入http://localhost:8000/upload
  3. 设置Headers中的Content-Typemultipart/form-data
  4. 在Body中选择form-data,然后点击Add file选择你要上传的文件。
  5. 然后在Value处点击Search Files选择需要上传的文件。
  6. 发送请求,并查看响应。

在body处选择 form-data类型请求,创建个key为file的键值对。
在这里插入图片描述
点击Search Files选择需要上传的文件
在这里插入图片描述
选择文件
在这里插入图片描述

点击发送请求
在这里插入图片描述

在这里插入图片描述
上传成功
在这里插入图片描述

使用Python requests库

我们现在桌面创建个txt文档
在这里插入图片描述

在这里插入图片描述

import requestsurl = 'http://localhost:8000/upload'
files = {'file': open(r'C:\Users\dell\Desktop\text.txt', 'rb')}response = requests.post(url, files=files)
print(response.text)

在这里插入图片描述

上传成功
在这里插入图片描述

文件上传的进阶用法

3. 验证上传文件的类型

为了防止用户上传不安全的文件类型(如可执行文件、脚本文件等),你需要在服务器端验证上传文件的MIME类型或文件扩展名。

from sanic import HTTPResponse, request, json@app.route("/upload", methods=["POST"])
async def handle_upload(request):file = request.files.get("file")if not file:return json({"error": "没有文件被上传"}, status=400)# 检查文件类型allowed_types = {"image/jpeg", "image/png", "application/pdf"}if file.type not in allowed_types:return json({"error": "不允许的文件类型"}, status=400)# 保存文件(这里省略了具体的保存逻辑)return json({"message": "文件上传成功"})

在这个例子中,我们检查了上传文件的type属性,它通常包含了文件的MIME类型。我们定义了一个allowed_types集合,包含了允许上传的文件类型。如果上传的文件类型不在这个集合中,我们就返回一个错误响应。

4. 安全性考虑

  • 防止目录遍历:确保在保存上传文件时,不要直接使用用户输入的文件名或路径,以防止目录遍历攻击。可以使用哈希函数或UUID来生成唯一的文件名。
  • 限制上传目录的权限:确保上传目录的权限设置得当,以防止未授权访问或执行上传的文件。
  • 使用HTTPS:在生产环境中,始终使用HTTPS来保护用户数据和文件传输的安全性。

5. 进度反馈

对于大文件上传,用户可能会希望看到上传进度。然而,Sanic本身并不直接支持上传进度的跟踪。但是,你可以通过前端JavaScript(如使用XMLHttpRequest或Fetch API的upload事件)来跟踪上传进度,并通过WebSocket、Server-Sent Events (SSE) 或轮询等方式将进度信息发送到服务器,然后服务器可以将这些信息广播给需要它们的客户端。

6. 异步文件处理

如果你需要在文件上传后执行一些耗时的处理(如图像分析、视频转码等),并且这些处理不需要立即返回结果给用户,你可以将这些处理任务放入后台执行。这可以通过将任务提交到消息队列(如RabbitMQ、Kafka)或使用后台工作进程(如Celery)来实现。

7. 监控和日志

对于生产环境中的应用,监控和日志记录是非常重要的。你可以使用Sanic的日志系统来记录关键事件和错误,并使用如Prometheus、Grafana等工具来监控应用的性能。

总结

在使用Sanic进行文件上传时,除了处理文件本身之外,还需要考虑安全性、性能、用户体验等多个方面。通过验证文件类型、限制文件大小、使用异步IO、提供进度反馈以及实施适当的监控和日志记录,你可以构建出既安全又高效的文件上传功能。

这篇关于【pyhton】Sanic框架的文件上传功能开发实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

SpringCloud使用Nacos 配置中心实现配置自动刷新功能使用

《SpringCloud使用Nacos配置中心实现配置自动刷新功能使用》SpringCloud项目中使用Nacos作为配置中心可以方便开发及运维人员随时查看配置信息,及配置共享,并且Nacos支持配... 目录前言一、Nacos中集中配置方式?二、使用步骤1.使用$Value 注解2.使用@Configur

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

GitLab文件的上传与下载方式

《GitLab文件的上传与下载方式》:本文主要介绍GitLab文件的上传与下载方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录GitLab 项目拉取到本地GitLab 项目上传方法方法 1:本地项目未初始化Git方法 2:本地项目已初始化GitGitLab 上