如何发送 FastAPI 响应而不将用户重定向到另一个页面?

2024-01-04

我正在使用 FastAPI 创建一个 API,它接收form-data从 HTML 页面处理数据(需要一些时间)并返回一条消息,说明此任务已完成。

这是我的后端:

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后端的返回语句只是将用户重定向到一个仅显示返回消息的新页面。我正在寻找一种替代方案,使 HTML 表单保持显示并在该表单下方显示从服务器返回的消息。例如:

我搜索了有关请求的 FastAPI 文档 https://fastapi.tiangolo.com/advanced/custom-response/,但我还没有找到任何可以避免修改我的原始 HTML 页面的内容。


您需要使用 Javascript 接口/库,例如获取API https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API,发出异步 HTTP 请求。另外,你应该使用模板 https://fastapi.tiangolo.com/advanced/templates/渲染并返回TemplateResponse, 代替FileResponse https://fastapi.tiangolo.com/advanced/custom-response/#fileresponse,如您的代码所示。还可以找到相关答案here https://stackoverflow.com/a/73359311/17865804 and here https://stackoverflow.com/a/73358937/17865804,这显示了如何处理<form>提交关于submit事件,并防止导致页面重新加载的默认操作。如果您想发帖JSON相反,看看数据这个答案 https://stackoverflow.com/a/71741617/17865804,同时发布两者Files and Form/JSON数据,看一下这个答案 https://stackoverflow.com/a/70640522/17865804.

工作示例:

app.py

from fastapi import FastAPI, Form, Request
from fastapi.templating import Jinja2Templates

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

@app.post("/submit")
async def submit(request: Request, taskname: str = Form(...), tasknumber: int = Form(...)):
    return f'Super resolution completed! task {tasknumber} of {taskname} done'

@app.get("/")
async def index(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

模板/索引.html

<!DOCTYPE html>
<html>
   <body>
      <h1>Super resolution image treatment</h1>
      <form method="post" id="myForm">
         <label for="taskname" style="font-size: 20px">Task name*:</label><br>
         <input type="text" name="taskname" id="taskname"><br>
         <label for="tasknumber" style="font-size: 20px">Task number*:</label><br>
         <input type="number" name="tasknumber" id="tasknumber">
         <p style="display:inline"><b>* Cannot be null</b></p><br><br>
         <input type="button" value="Start" onclick="submitForm()">
      </form>
      <div id="responseArea"></div>
      <script>
         function submitForm() {
             var formElement = document.getElementById('myForm');
             var data = new FormData(formElement);
             fetch('/submit', {
                   method: 'POST',
                   body: data,
                 })
                 .then(resp => resp.text())  // or, resp.json(), etc.
                 .then(data => {
                   document.getElementById("responseArea").innerHTML = data;
                 })
                 .catch(error => {
                   console.error(error);
                 });
         }
      </script>
   </body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何发送 FastAPI 响应而不将用户重定向到另一个页面? 的相关文章

随机推荐

  • 在 C# 中使用 String.Format 格式化字符串时出现问题

    我需要以特定格式在消息框中打印一个字符串 我使用的代码类似于如下所示 string text for int i 0 i
  • 用于选择特定内容的正则表达式,前提是该内容未包含在注释中

    我正在寻找与模式 src js 匹配的正则表达式 但这不应包含在注释中 考虑以下 扩展样本输入 被 OP 描述为 正确
  • 为什么 PHP 中的 T 是意外的 T_VARIABLE

    这个 PHP 错误中的 T 是什么意思 Parse error syntax error unexpected T VARIABLE mean 我知道错误本身意味着什么 但我想知道为什么它不仅仅是 变量 T 代表 令牌 当 PHP 代码运行
  • 如何在 macOS 上的 Qt 中使用 OpenMP 进行编译?

    我试图在我的 C Qt 应用程序中引入一些 OMP 并行化 但无法在 macOS 下编译它 同事们正在使用 Windows 或 Linux 一切都工作正常 我需要在 Qt 的 pro 文件中编写什么并在我的系统中执行哪些操作 此网站或任何其
  • 当所有代码更改均由 DBA 完成时,是否有替代使用 EF 进行 Code First 迁移的方法?

    我读过有关 代码优先迁移 的内容 但似乎这并不真正适合企业 我们有一个 DBA 来完成所有数据库更改 我们不需要将这些更改放入类中 也不需要由应用程序执行数据库迁移 如果我们更改类和 Fluent API 然后让 DBA 对数据库进行更改
  • 存储过程 - 结束日期

    我正在听 Hansel 分钟播客 StackOverflow 使用 ASP NET MVC Jeff Atwood 和他的技术团队 在播客过程中 他们谈论 SQL Server 并说了类似 存储过程的时代已经结束 的话 现在我不是一名 DB
  • cookie 不起作用,apache 到 nginx

    我已将我的网站从 apache 移至 nginx 但现在我遇到的问题是 当我的用户尝试登录网站时 我的网站不想向他们发送 cookie 或启动会话 这是我的登录脚本
  • 字体非常难看

    我正在使用以下代码绘制一个字符串 public Image DrawString String lString Image lImage new Bitmap 128 128 Rectangle rec new Rectangle 0 0
  • 使用相同 glm 的 glm 预测和 geom_smooth() 之间的差异

    我正在尝试使用概率模型重现其他人的工作 不幸的是 我没有太多关于他们的方法的信息 只有他们的起始数据和模型图 当我在 ggplot 中绘制数据并使用拟合线时geom smooth method glm 我能够重现以前的工作 然而 当我尝试使
  • 如何在golang中从AWS S3获取资源URL

    我需要使用 golang 获取资源的公共永久 未签名 URL官方AWS Go SDK https github com aws aws sdk go 在Java AWS S3 SDK中有一个方法称为getResourceUrl http d
  • Internet Explorer 11 在首次加载时忽略 list-style:none

    I am using the Superfish jQuery plugin for my menu In Chrome and in mobile Opera emulator it works fine but in Internet
  • 使用 Moq 验证方法调用

    我对 C 单元测试和学习使用 Moq 相当陌生 下面是我要测试的课程 class MyClass SomeClass someClass public MyClass SomeClass someClass this someClass s
  • 在 python 中搜索字符串匹配后如何从列表中获取下一个元素

    嗨 朋友们 我有一个列表 我正在其中搜索字符串 并且随着搜索的字符串我想获取列表项的下一个元素 下面是示例代码 gt gt gt contents apple fruit vegi leafy gt gt gt info data for
  • 在 xtext 语法中定义原语

    我想使用 xtext 创建一个极其简单的 DSL 具有以下功能 它将有两种基本类型 数字和字符串 用户可以定义自己的类 类由字段声明组成 字段声明将名称与类型相关联 其中类型可以是类或基元 以下是我对 DSL 的尝试 类定义和引用工作正常
  • UWP 应用程序在启动时自动启动

    一切都在标题中 我目前正在寻找一种方法来启动我的UWP app 自动地仅使用 UWP 框架启动 Windows 时 计算机上没有文件操作 该应用程序必须能够在应用商店中共享并在 Windows 启动时打开 这是一件可行的事情吗 如果是这样怎
  • 组织导入 Eclipse 方法

    I need to know which method is called inside eclipse when I press CTRL SHIFT O Organise Imports in order to invoke it af
  • 使用 azurerm 配置 Terraform 子网时出错

    最近我发现我的 AKS 集群拥有一个太小的子网 因此 我尝试添加第二个子网和节点池 现在可以通过 Azure CNI 实现 然后创建一个适当的子网并将其迁移回来 During terraform plan有效响应一切顺利 但是在应用时会抛出
  • Git 在制表符和空格之间进行转换,但只是有时

    首先 我是 git 的新手 就像 如果缓存在暂存区域中命中我 我几乎无法区分缓存和索引 或类似的东西 排除了这一点 我的问题是这样的 假设我想要处理一个编码风格要求缩进空格的项目 但我喜欢制表符 似乎我可以使用清洁和涂抹功能 但有一个问题
  • 在 JS 中新建一行

    你好 我有这个 JS 代码 function myFunction var g var d new Date getDay switch d case 0 g Today it s Sunday break case 1 g Today i
  • 如何发送 FastAPI 响应而不将用户重定向到另一个页面?

    我正在使用 FastAPI 创建一个 API 它接收form data从 HTML 页面处理数据 需要一些时间 并返回一条消息 说明此任务已完成 这是我的后端 from cgi import test from fastapi import