【发布时间】:2022-08-15 14:12:14
【问题描述】:
我正在使用 FastAPI 创建一个 API,它从 HTML 页面接收form-data,处理数据(需要一些时间)并返回一条消息,说明此任务已完成。
这是我的后端:
from cgi import test
from fastapi import FastAPI, Form, Request
from starlette.responses import FileResponse
app = FastAPI()
@app.post(\"/\")
async def swinir_dict_creation(request: Request,taskname: str = Form(...),tasknumber: int = Form(...)):
args_to_test = {\"taskname\":taskname, \"tasknumber\":tasknumber} # dict creation
print(\'\\n\',args_to_test,\'\\n\')
# my_function_does_some_data_treatment.main(args_to_test)
# return \'Treating...\'
return \'Super resolution completed! task \'+str(args_to_test[\"tasknumber\"])+\' of \'+args_to_test[\"taskname\"]+\' done\'
@app.get(\"/\")
async def read_index():
return FileResponse(\"index.html\")
这是我的前端代码:
<html>
<head>
<h1><b>Super resolution image treatment</b></h1>
<body>
<form action=\"http://127.0.0.1:8000/\" method=\"post\" enctype=\"multipart/form-data\">
<label for=\"taskname\" style=\"font-size: 20px\">Task name*:</label>
<input type=\"text\" name=\"taskname\" id=\"taskname\" />
<label for=\"tasknumber\" style=\"font-size: 20px\">Task number*:</label>
<input type=\"number\" name=\"tasknumber\" id=\"tasknumber\" />
<b><p style=\"display:inline\"> * Cannot be null</p></b>
<button type=\"submit\" value=\"Submit\">Start</button>
</form>
</body>
</head>
</html>
所以前端页面是这样的:
当后端处理完成后,用户提交了一些数据后,FastAPI 后端的 return 语句只是将用户重定向到一个只显示返回消息的新页面。我正在寻找一种替代方案,它可以保持 HTML 表单出现并在此表单下方显示从服务器返回的消息。例如:
我在FastAPI documentation about requests 中进行了搜索,但没有找到任何可以避免修改我的原始 HTML 页面的内容。
-
您需要使用 Fetch API 之类的东西对 API 进行 AJAX 调用。与How can I make an AJAX call without jQuery? 重复
-
@esqew,可能是这样,但我在这里得到的答案更清楚地解决了问题,而且它还展示了如何将它与 HTML 代码集成。因此,我会检查“不重复”,以考虑未来可能有同样疑问的人。