我正在编写代码以接收FastAPI中的JSON有效负载。
这是我的代码:
from fastapi import FastAPI, status, Request
from fastapi.responses import ORJSONResponse
import uvicorn
import asyncio
import orjson
app = FastAPI()
@app.post("/", status_code = status.HTTP_200_OK)
async def get_data(request: Request):
param = await request.json()
return param但是,我想要的是request.json()与orjson一起使用,而不是使用默认的json库。知道怎么解决这个问题吗?请帮帮我,谢谢。
发布于 2022-10-23 16:49:48
调用request.json()时,FastAPI (实际上是Starlette)首先读取主体(使用Request对象的.body()方法),然后调用json.loads() (使用Request的标准json库)将dict/list对象返回给端点内部的dict/list对象(参见实现这里),正如您在注释部分中提到的那样,-it不使用.dumps(),因为该方法用于将Python对象序列化为JSON。
因此,要使用orjson来转换主体,可以使用下面的内容(如果希望使用def而不是async def端点获取原始主体,请查看这里):
from fastapi import FastAPI, Request
import orjson
app = FastAPI()
@app.post('/')
async def submit(request: Request):
body = await request.body()
return orjson.loads(body)当返回数据(如dict、list等)时,FastAPI将使用Python json.dumps()自动将返回值转换为JSON (有关更多细节,请参见这个答案 )。因此,如果您想再次使用orjson库,需要直接发送自定义Response,如这个答案中所述。示例:
from fastapi import Response
# ...
return Response(orjson.dumps(orjson.loads(body)), media_type="application/json")请确保查看这里、这里以及这里和这里,以了解将JSON数据发送到FastAPI后端的各种方法,以及如何定义一个端点来期待和验证JSON数据,而不是依赖request.json() (这在传递任意JSON数据时非常有用)。
https://stackoverflow.com/questions/74168582
复制相似问题