我正在尝试使用Jinja2
和FastAPI
为我的API构建一个简单的web界面(UI)。包含两个输入的UI部分是固定的,但另一部分是动态创建的,方法是使用字典中的键/项填充HTML
模板。为简单起见,我使用的字典只有3个键/项,但实际上可能有8个或11个键/项。
我正在努力收集动态生成的输入,因为我不知道如何做到这一点,而不必在代码中硬编码它们的名称。下面是函数中硬编码参数的示例。有没有办法一次收集所有输入,然后以某种方式“解包”它们?我曾考虑将输入放在一个可编辑的表格中,但后来我又在努力收集表格的内容
这是用户界面:
以下是Python代码:
from fastapi import FastAPI, Request, Form
from fastapi.templating import Jinja2Templates
dct = {"ctp_a": 1,
"ctp_b": 2,
"ctp_c": 20}
app = FastAPI()
templates = Jinja2Templates(directory="templates/")
@app.get("/form")
def form_post(request: Request):
result = dct
return templates.TemplateResponse('form3.html', context={'request': request, 'result': result})
@app.post("/form")
def form_post(
request: Request, multiply_by: int = Form(...),
# this is hardcoded which I don't like
ctp_a_nm: str = Form(...), ctp_b_nm: str = Form(...), ctp_c_nm: str = Form(...),
# this is hardcoded as well
ctp_a: int = Form(...), ctp_b: int = Form(...), ctp_c: int = Form(...)
):
result = {ctp_a_nm: ctp_a*multiply_by,
ctp_b_nm: ctp_b*multiply_by,
ctp_c_nm: ctp_c*multiply_by}
return templates.TemplateResponse('form3.html', context={'request': request, 'result': result})
这是html模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Sample Form</title>
</head>
<body>
<form method="post">
<label for="multiply_by">Multiply by</label><br>
<input type="number" name="multiply_by" value="2"/><br><br>
{% for key in result %}
<input type="text" name="{{ key }}_nm" value="{{ key }}" readonly />
<input type="number" name="{{ key }}" value="{{ result[key] }}"/><br>
{% endfor %}
<br><input type="submit">
</form>
</body>
</html>
这个答案建立在@MatsLindh在评论中的建议之上
POST请求部分可以这样重写,允许n个键/值
需要更改UI,以便使用唯一的名称引用名称和值
相关问题 更多 >
编程相关推荐