使用Starlette处理文件上传与下载
发布时间:2024-01-13 02:17:59
Starlette 是一个轻量级的 ASGI 框架,用于快速构建高性能的异步 Web 应用程序。它非常适合处理文件上传和下载,因为它能够在异步、非阻塞的方式中处理这些 IO 操作。下面是一个使用 Starlette 处理文件上传和下载的示例。
文件上传:
在 Starlette 中处理文件上传通常涉及创建一个端点来处理 POST 请求,并使用 FormData 解析上传的文件。以下是一个处理文件上传的例子:
from starlette.applications import Starlette
from starlette.responses import JSONResponse
app = Starlette()
@app.route("/upload", methods=["POST"])
async def upload(request):
form = await request.form()
file = form["file"]
# 执行文件保存逻辑
await file.save(f"uploads/{file.filename}")
return JSONResponse({"message": "上传成功"})
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
在上述例子中,我们定义了一个 /upload 的端点来处理 POST 请求。通过使用 await request.form(),我们可以访问请求中的 FormData。通过 form["file"],我们可以获取上传文件的数据。在这个例子中,我们将文件保存在 uploads 目录下。
文件下载:
在 Starlette 中处理文件下载通常涉及创建一个端点来处理 GET 请求,并返回文件的响应。以下是一个处理文件下载的例子:
from starlette.applications import Starlette
from starlette.responses import FileResponse
app = Starlette()
@app.route("/download")
def download(request):
file_path = "path/to/file" # 文件路径
return FileResponse(path=file_path, filename="file.txt")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
在上述例子中,我们定义了一个 /download 的端点来处理 GET 请求。在 download 函数中,我们使用 FileResponse 返回文件的响应。通过指定 path 参数来设置文件的路径,指定 filename 参数来设置下载时的文件名。
以上是使用 Starlette 处理文件上传和下载的简单示例。由于 Starlette 是一个非常灵活和可扩展的框架,您可以根据自己的需求进一步定制和扩展这些功能。
