首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FastAPI中的orjson库读取请求体?

如何使用FastAPI中的orjson库读取请求体?
EN

Stack Overflow用户
提问于 2022-10-23 04:07:59
回答 1查看 154关注 0票数 1

我正在编写代码以接收FastAPI中的JSON有效负载。

这是我的代码:

代码语言:javascript
复制
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库。知道怎么解决这个问题吗?请帮帮我,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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端点获取原始主体,请查看这里):

代码语言:javascript
复制
from fastapi import FastAPI, Request
import orjson

app = FastAPI()

@app.post('/')
async def submit(request: Request):
    body = await request.body()
    return orjson.loads(body)

当返回数据(如dictlist等)时,FastAPI将使用Python json.dumps()自动将返回值转换为JSON (有关更多细节,请参见这个答案 )。因此,如果您想再次使用orjson库,需要直接发送自定义Response,如这个答案中所述。示例:

代码语言:javascript
复制
from fastapi import Response
# ...
return Response(orjson.dumps(orjson.loads(body)), media_type="application/json")

请确保查看这里这里以及这里这里,以了解将JSON数据发送到FastAPI后端的各种方法,以及如何定义一个端点来期待和验证JSON数据,而不是依赖request.json() (这在传递任意JSON数据时非常有用)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74168582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档