Python中SimpleTemplateResponse()的文件上传和下载实例
在Python中,可以使用SimpleTemplateResponse()来创建模板响应对象,用于动态生成HTML或其他文本文件。SimpleTemplateResponse()基于starlette.responses.TemplateResponse,但更加简洁易用。
在下面的例子中,我们将展示如何使用SimpleTemplateResponse()实现文件上传和下载的功能。
首先,我们需要安装fastapi和uvicorn库,用于创建和运行一个FastAPI应用程序。可以使用以下命令安装这些依赖项:
pip install fastapi uvicorn
接下来,我们将创建一个FastAPI应用,用于处理文件上传和下载的路由。
from fastapi import FastAPI, UploadFile
from fastapi.responses import FileResponse
from fastapi.templating import Jinja2Templates
from starlette.responses import SimpleTemplateResponse
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/")
async def read_index():
return SimpleTemplateResponse("index.html", {"request": None})
@app.post("/upload")
async def process_upload(file: UploadFile = File(...)):
# 处理上传的文件,将其保存到服务器上
contents = await file.read()
with open(file.filename, "wb") as f:
f.write(contents)
return {"filename": file.filename}
@app.get("/download/{filename}")
async def download_file(filename: str):
# 下载指定文件
return FileResponse(filename)
在上面的代码中,我们定义了三个路由:
- /:返回一个包含上传表单的HTML页面。
- /upload:处理文件上传请求,并将上传的文件保存到服务器上。
- /download/{filename}:提供文件下载功能,根据指定的文件名返回相应的文件。
我们还使用了Jinja2Templates来渲染模板文件。在同级目录下创建一个templates文件夹,并在其中创建一个index.html模板文件:
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">Upload</button>
</form>
</body>
</html>
在以上代码中,我们创建了一个包含上传表单的HTML页面。用户可以选择一个文件并点击Upload按钮来上传文件。
完成以上步骤后,我们可以通过以下命令运行FastAPI应用:
uvicorn main:app --reload
现在,当我们访问http://localhost:8000/时,将看到一个包含上传表单的页面。
我们可以选择一个文件并点击Upload按钮来将文件上传到服务器上。上传成功后,将返回一个带有文件名的JSON响应。
要下载已上传的文件,可以访问http://localhost:8000/download/{filename},其中{filename}为要下载的文件名。
以上就是使用SimpleTemplateResponse()实现文件上传和下载功能的代码示例。通过这个例子,我们可以了解如何使用Python和FastAPI创建一个简单的文件上传和下载服务。
