簡體   English   中英

FastAPI:如何返回包含 numpy 數組的字典?

[英]FastAPI: How to return a dictionary that includes numpy arrays?

當我嘗試從端點'/'訪問'data'變量時出現以下錯誤。

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

代碼:

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變量變得可見?

FastAPI 不知道它應該如何將 numpy 數組解碼為 JSON; 相反,您可以自己明確地執行此操作,然后將結構作為原生 Python 數據類型或作為原始 JSON 字符串返回。 您可以通過使用 FastAPI 中的自定義Response對象來做到這一點

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

或者,如果您將其格式化為本機數據類型:

return JSONResponse(content=numpy_as_native_datatypes)

您應該在返回數據之前將任何 numpy 數組轉換(序列化)為JSON 例如:

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

或者,您可以序列化整個字典對象並在自定義Response中返回它,如下所示:

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

或者您甚至可以使用jsonable_encoder (FastAPI 在內部使用它來將返回值轉換為JSON )並直接返回JSONResponse

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM