FastAPI:如何返回包含 numpy 数组的字典?

问题描述 投票:0回答:2

当我尝试从端点

'data'
访问
'/'
变量时,出现以下错误。

ValueError: [ValueError('dictionary update sequence element #0 has length 1; 2 is required'), TypeError('vars() argument must have __dict__ attribute')]

这就是 FastAPI 后端的样子:

from fastapi import FastAPI
app = FastAPI()
data = {}
@app.on_event("startup")
def startup_event():
    data[1]  =  [...] ...(numpy array)
    data[2]  = [...] ...(numpy array)
    return data


@app.get("/")
def home():
    return {'Data': data}

当我启动端点时,我看到

'Internal Server Error'
。端点
'/'
处不会显示任何内容。但是,如果我在端点
'print(data)'
的 return in home 函数上方添加此行 ->
'/'
,它会按照启动函数中的指定打印存储在
data
字典中的值。如何解决该问题,以便在访问
data
端点时
'/'
变量变得可见?

python numpy server web-applications fastapi
2个回答
1
投票

选项1

在返回数据之前,您应该将任何 numpy 数组转换(序列化)为

JSON
。示例:

data = {}
data[1] = json.dumps(np.array([1, 2, 3, 4]).tolist())
data[2] = json.dumps(np.array([5, 6, 7, 8]).tolist())
return data

选项2

或者,您可以序列化整个字典对象并将其返回到自定义

Response
中,如下所示:

from fastapi import Response

json_data = json.dumps({k: v.tolist() for k, v in data.items()})
return Response(content=json_data, media_type="application/json")

选项3

另一种选择是使用

jsonable_encoder
——FastAPI 在返回值时在内部使用,以便将不可序列化的对象转换为
str
——然后返回
JSONResponse
,或者直接自定义
Response
(如上一个选项所示),这将返回
application/json
对客户端的编码响应,如此处所述。

from fastapi.responses import JSONResponse
from fastapi.encoders import jsonable_encoder

json_data = jsonable_encoder({k: v.tolist() for k, v in data.items()})
return JSONResponse(content=json_data)

0
投票

FastAPI 不知道如何将 numpy 数组解码为 JSON;相反,您可以自己显式执行此操作,然后将结构作为本机 Python 数据类型或原始 JSON 字符串返回。 您可以通过使用 FastAPI

 中的自定义 
Response 对象来完成此操作。

return Response(content=numpy_as_json, media_type="application/json")

或者如果您将其格式化为本机数据类型:

return JSONResponse(content=numpy_as_native_datatypes)
© www.soinside.com 2019 - 2024. All rights reserved.