【问题标题】:Reciving JSON with FastAPI-backend使用 FastAPI 后端接收 JSON
【发布时间】:2021-05-02 06:23:00
【问题描述】:

我在将 JSON 从前端发送到后端并在那里读取时遇到了一点问题。 一开始是简单的部分,在我的index.html 中,我阅读了一些领域的内容并将其传递给var inputs

<script type="text/javascript">
    function get_inputs()
    {
        var inputs =
            {
                T_0 : document.getElementById("a").value,
                E_A : document.getElementById("b").value,
                           }
        backend_test(inputs)
        console.log("input:" + JSON.stringify(inputs))
        return inputs
    }
</script>

"console.log("input:" + JSON.stringify(inputs))" 输出到控制台:

输入:{"T_0":"3","E_A":"5"}

这调用了函数 backend_test,它应该接受我所做的输入并通过 GET 请求将其作为 JSON 发送到我的 FastAPI:

function backend_test(inputs)
{
    var inputs = inputs
    
    console.log('frontend_func inputs out: ' + JSON.stringify(inputs))


$(document).ready(function()  //supposed to wait for the functions to be fully loaded
{
$.ajax({
            type: 'GET',
            contentType: 'application/json',
            data: JSON.stringify(inputs),
            dataType: "json", 
            url:"fastapi/compute",
            success: function (result) 
            { 
                console.log(result)
                console.log("should work")
            },
            error: function (error) 
            {
                console.log(error)
                console.log("error, but where?")
            }
        });
});
return("yay")
}

现在,在我的后端,我想以某种方式使用这些信息进行进一步的计算:

from fastapi import Request, FastAPI
from pydantic import BaseModel
from .self_ignition import test_function
from typing import List

class Liste(BaseModel):
    T_0: int
    E_A: int

@app.get("/compute")
def calculate(liste: Liste):

    
    return {"backend output:" + liste}

按原样发送请求会在我的前端控制台中提供“错误 422 无法处理的实体”,我收到“错误,但在哪里?”在我的“backend_test”函数中定义的消息。 有一个到后端的连接,调用 /compute 并且在 calculate() 中没有任何输入会给我函数 backend_test(inputs) 定义的成功输出:“应该工作”。 我无法直接查看后端代码中的错误,因为一切都是在公司 GitLab 框架中设置的,并且只有通过提交更改并启动更新的网页才能进行测试。

使用“基本模型”是我在文档中阅读后的最后一次尝试,从事类似项目但使用不同 API 的人只需要编写“def calculate (body)”并且有他的信息,但是这似乎在这个 API 中不起作用

请注意,这些只是使连接工作的代码的一部分。我真正需要的是知道 FastAPI 如何处理 JSON 的接收,因为文档并没有真正帮助我使其工作。

在此先感谢,我在这个小问题上坐了 2 天,一直返回相同的帮助页面,但无法正常工作。

解决方案:

将 Number() 添加到这部分,因为我后来将它们称为 int 而不是 str:

T_0 : Number(document.getElementById("a").value),
E_A : Number(document.getElementById("b").value),

在此处将类型更改为 POST:

$.ajax({
            type: 'POST',

这里:

@app.post("/compute")

并且不要试图返回列表,而是一个将该列表的元素作为 str 的变量:

x=str(liste.T_0)

return {"backend output:"+x}

【问题讨论】:

  • 你似乎没有说你的错误是什么?当您将数据发送到后端时,您的后端是否记录错误?如果是这样,错误是什么?
  • 对不起,添加了错误消息(即使它可能不是很有帮助)。有点专注于交付所有代码 sn-ps 以明确我想要实现的目标。
  • 可以添加console.log("input:" + JSON.stringify(inputs))的输出吗?
  • 将输出添加到问题中,它给了我: input:{"T_0":"3","E_A":"5"} 其中 3 和 5 是我在首页的输入跨度>

标签: python json fastapi get-request


【解决方案1】:

您应该将值转换为整数。

您的模型需要整数。

class Liste(BaseModel):
    T_0: int
    E_A: int

这意味着你应该这样发送

{"T_0": int,"E_A": int}

但在您目前的情况下,您发送的是string 而不是int

使用 NumberparseInt 将其转换为 int 然后它应该可以工作。

将您的请求方法更改为发布。

type: 'POST'

您还可以更改在服务器端发布的方法。

@app.post("/compute")

【讨论】:

  • 谢谢,有意义并将它们更改为整数,不幸的是这仍然不起作用,我仍然得到:XHRGET***********/fastapi/compute?{ %22T_0%22:2,%22E_A%22:3} [HTTP/2 422 No Reason Phrase 215ms] 用“*************”作为我必须删除的公司地址的占位符
  • 我最好的猜测是要么我以错误的方式发送它(无论是用 $.ajax({....我发现的方法中,抱歉,我现在或多或少是边做边学
  • 啊,或者您是想将它们作为查询参数或请求正文发送?
  • 所以:我不太熟悉其中的区别,但因为查询参数似乎不是我想要的,我会去请求正文,但对不起,我是这里的菜鸟。将方法更改为“POST”给了我:XHRPOST*********/fastapi/compute [HTTP/2 500 Internal Server Error 130ms]
  • 然后为了测试,我在我的 return {"backend output:} 中删除了 "liste" 输出,我从我的函数中得到了 "backend output" 作为数组 + "应该工作"。但是因为我想要访问 JSON 数据发送这不是解决方案。现在我尝试了这个: def calculate(liste: Liste): x=str(liste.T_0) return {"backend output:"+x} 瞧,我的输出是:"Array ["backend output:8" ]" 所以来回传递数据是可行的!
猜你喜欢
  • 2023-03-19
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多