如何在FastAPI中设置响应类



使用orjson序列化响应对fastAPI restful服务的速度有显著影响,特别是对于非常大的对象。正如我在官方文档中所读到的,我们可以直接使用响应类作为api方法的参数。问题是,当我直接使用ORJSONResponse作为函数时,它是有效的;然而,当将其传递到参数esponse_class=ORJSONResponse时,它不起作用。

1.直接调用ORJSONResponse()的示例代码:

这段代码在75ms中运行,大小6.6MB,表明orjson序列化工作正常。它比.net核心更快,这正是我所需要的。

from fastapi import APIRouter
from fastapi.responses import ORJSONResponse
router=APIRouter()
__all__=["router"]
siz=1000000
ret=[None]*siz
for i in range(0,siz-1):
ret[i]=i
@router.get("/planlist"))
def plan_list():
ORJSONResponse(ret)

2.以传递ORJSONResponse为参数的示例代码:

这段代码就像没有响应类集一样运行。在相同的6.6MB大小下,876ms所需时间要长10倍以上。则表明CCD_ 5没有被正确设置。

from fastapi import APIRouter
from fastapi.responses import ORJSONResponse
router=APIRouter()
__all__=["router"]
siz=1000000
ret=[None]*siz
for i in range(0,siz-1):
ret[i]=i
@router.get("/planlist",response_class=ORJSONResponse)
def plan_list():
for i in range(0,siz-1):
ret[i]=i
return ret

测试平台

  • 测试客户端:ansomnia core 2020.4.1,poster 7.34.0中的结果相同
  • Os:MacOS catalina 10.15.7,windows 10的结果相同
  • cpu:核心i9

此外,我们还有直接返回响应的文档。

所以你可以用这个,这不是一个坏的做法。

return ORJSONResponse(content=data)

但这将跳过验证、序列化和自动文档,这将为您提供巨大的灵活性和性能,但这也意味着,您需要确保内容准备就绪,并且需要手动设计OpenAPI模式。

最新更新