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 json app = 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.name with 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 打开postman,创建一个新的post请求。
- 在请求url中输入
http://localhost:8000/upload
。 - 设置headers中的
content-type
为multipart/form-data
。 - 在body中选择
form-data
,然后点击add file
选择你要上传的文件。 - 然后在value处点击search files选择需要上传的文件。
- 发送请求,并查看响应。
在body处选择 form-data类型请求,创建个key为file的键值对。
点击search files选择需要上传的文件
选择文件
点击发送请求
上传成功
使用python requests库
我们现在桌面创建个txt文档
import requests url = '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框架的文件上传功能开发实战的文章就介绍到这了,更多相关pyhton sanic文件上传内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论