python - 将文件上传到 FastAPI 时如何使用 HTML 复选框发送可选参数?

标签 python html checkbox fastapi

我想上传一个文件,该文件将使用可以具有多个参数的包进行分析。例如,我想上传音频文件,然后检查一些可选参数来分析该音频。以下是前端的示例:

enter image description here

但是,我不太明白如何在 API 中实现这一点。谁能帮帮我吗?

这是我到目前为止的代码:

class audiofILE(BaseModel):
    name : str
    speech : str
    music: str
    noise: str


app = FastAPI()

templates = Jinja2Templates(directory="template")

@app.get('/home/{user_name}', response_class=HTMLResponse)
def write_home(request: Request, user_name: str):
    return templates.TemplateResponse("basic_form.html", {"request": request, "username": user_name})

@app.post("/submitform")
async def handle_form(assignment: str = Form(...), audioFile: UploadFile = File(...)):
    try:
        seg = Segmenter()
        segmentation = seg(audioFile.filename)
        segmentation_1 = pd.DataFrame.from_records(segmentation, columns=['labels', 'start', 'stop'])
        if noise :
            result =
            return HTMLResponse(content=segmentation_1.to_html(), status_code=200)

    except Exception as e:
        return HTMLResponse(content={'message': str(e)}, status_code=400)

HTML 代码:

<!DOCTYPE html>
<html>
    <head>
        <title>Awesome Form</title>
        <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
    </head>
    <body>
        <h1>Super Realistic Form</h1>
        <form method="POST" enctype="multipart/form-data">
            <input type="file" name="file"><br>
            <input type="checkbox" id="multiply_by_2" name="multiply_by_2" value="True">
            <input type="submit" value="Submit">
        </form>
    </body>
</html>

如有任何帮助,我们将不胜感激,谢谢。

最佳答案

请查看this answer方法1 ,其中提供了有关如何提交 Form 的示例。和File数据在一起。

在您的示例中,您必须确保包含 action HTML <form> 中的属性(指定处理表单提交的 URL) ,以及定义 name 属性(指定 <input> 元素的名称),使用您为端点中的参数声明的相同键/名称。您可以将音频文件附带的各种参数声明为 OptionalFalse作为默认值,并让前端发送 True仅当用户选择它们时。

工作示例:

app.py

from fastapi import FastAPI, Form, File, UploadFile, Request
from typing import Optional
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory='templates')

@app.post('/submit')
def submit(
    speech: Optional[bool] = Form(False),
    music: Optional[bool] = Form(False),
    noise: Optional[bool] = Form(False),
    audio: UploadFile = File(...)
):
    if noise:
        print('Noise has been selected')
        
    return {'speech': speech, 'music': music, 'noise': noise, 'file': audio.filename}


@app.get('/', response_class=HTMLResponse)
def main(request: Request):
    return templates.TemplateResponse('index.html', {'request': request})

模板/index.html

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width, initial-scale=1">
   </head>
   <body>
      <form method="post" action="/submit"  enctype="multipart/form-data">
         <input type="checkbox" id="speech" name="speech" value="True">
         <label for="speech">Speech</label><br>
         <input type="checkbox" id="music" name="music" value="True">
         <label for="music">Music</label><br>
         <input type="checkbox" id="noise" name="noise" value="True">
         <label for="noise">Noise</label><br><br>
         <label for="audio">Choose audio file</label>
         <input type="file" id="audio" name="audio" onchange="enableSubmitBtn();"><br><br>
         <input type="submit" id="submitBtn" value="submit" disabled>
      </form>
      <script>
         function enableSubmitBtn() {
            document.getElementById('submitBtn').removeAttribute("disabled");
         }
      </script>
   </body>
</html>

关于python - 将文件上传到 FastAPI 时如何使用 HTML 复选框发送可选参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74307876/

相关文章:

javascript - 悬停在其他标签元素上

javascript - HTML 复选框 : Change Color

android - 如何使用一项 Activity 中的复选框设置不同的布局?

用于表单布局的 HTML/CSS 显示表

Python evdev 检测设备拔出

python - 使用 PyArg_ParseTuple 的 C++ 和 Python 3 内存泄漏

python - Ansible azure_rm_virtualmachine 在 Mac 上因缺少 pip 包而失败

javascript - 类型错误 : this is undefined - React JS,

android - 在 Android 中检查多个复选框

python - 估计 SymPy 函数的进度