Python 如何在FastAPI中设置响应类?

Python 如何在FastAPI中设置响应类?,python,serialization,fastapi,orjson,Python,Serialization,Fastapi,Orjson,使用序列化响应对restful服务的速度有显著的影响,特别是对于非常大的对象。正如我在官方文章中读到的,我们可以直接使用响应类作为api方法的参数。问题是,当我直接使用或jsonresponse作为函数时,它会工作;但是,将其传递到参数esponse\u class=ORJSONResponse时,它不起作用 1.直接调用或jsonresponse()的示例代码: 此代码在75ms中运行,大小6.6mb,显示orjson序列化工作正常。 它比.NETCore快,这正是我所需要的 from fas

使用序列化响应对restful服务的速度有显著的影响,特别是对于非常大的对象。正如我在官方文章中读到的,我们可以直接使用响应类作为api方法的参数。问题是,当我直接使用
或jsonresponse
作为函数时,它会工作;但是,将其传递到参数
esponse\u class=ORJSONResponse
时,它不起作用

1.直接调用
或jsonresponse()
的示例代码: 此代码在75ms中运行,大小6.6mb,显示orjson序列化工作正常。 它比.NETCore快,这正是我所需要的

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.传递
或JsonResponse
作为参数的示例代码: 这段代码运行起来就像没有设置响应类一样。在相同的6.6MB大小中,876ms所需时间是10倍以上。它显示
或json
未正确设置

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,与postman 7.34.0中的结果相同
  • 操作系统:MacOS catalina 10.15.7,windows 10的结果相同
  • cpu:核心i9

此外,我们还提供了有关的文档

所以你可以用这个,这不是一个坏习惯

返回ORJSONResponse(内容=数据)

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

第二个示例中的for循环可能会导致这一巨大差异。否则,这就太奇怪了。感谢您的回答,在这种情况下是的,因为数据量大,时间比验证更重要。所以验证主要需要在这里输入,然后输出。对于语句,我已经在模块全局范围内的方法一侧设置了它,当它被称为数据时,数据就准备好了。这不会引起太大的尊重。