使用 FastAPI 后端接收 JSON
Reciving JSON with FastAPI-backend
我在将 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("输入:" + JSON.stringify(输入))"
输出到控制台:
输入:{"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() 中没有任何输入将给我 in function backend_test(inputs) 定义的成功输出:“应该工作”。
我无法直接查看后端代码中的错误,因为公司 GitLab 框架中的所有内容都是 set_up,并且只有通过提交更改并启动更新的网页才能进行测试。
使用“基本模型”是我在阅读文档中的相关内容后的最后一次尝试,那个从事类似项目但使用不同 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")
并且不要尝试 return 列表,而是将此列表的元素作为 str:
的变量
x=str(liste.T_0)
return {"backend output:"+x}
您应该将值转换为整数。
您的模型需要整数。
class Liste(BaseModel):
T_0: int
E_A: int
这意味着你应该这样发送
{"T_0": int,"E_A": int}
但在您目前的情况下,您发送的是 string
而不是 int
。
使用 Number
或 parseInt
将其转换为 int 然后它应该可以工作。
将您的请求方法更改为 post。
type: 'POST'
您还可以在服务器端将方法更改为 post。
@app.post("/compute")
我在将 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("输入:" + JSON.stringify(输入))" 输出到控制台:
输入:{"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() 中没有任何输入将给我 in function backend_test(inputs) 定义的成功输出:“应该工作”。 我无法直接查看后端代码中的错误,因为公司 GitLab 框架中的所有内容都是 set_up,并且只有通过提交更改并启动更新的网页才能进行测试。
使用“基本模型”是我在阅读文档中的相关内容后的最后一次尝试,那个从事类似项目但使用不同 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")
并且不要尝试 return 列表,而是将此列表的元素作为 str:
的变量x=str(liste.T_0)
return {"backend output:"+x}
您应该将值转换为整数。
您的模型需要整数。
class Liste(BaseModel):
T_0: int
E_A: int
这意味着你应该这样发送
{"T_0": int,"E_A": int}
但在您目前的情况下,您发送的是 string
而不是 int
。
使用 Number
或 parseInt
将其转换为 int 然后它应该可以工作。
将您的请求方法更改为 post。
type: 'POST'
您还可以在服务器端将方法更改为 post。
@app.post("/compute")