如何加快FastAPI中的JSON响应速度?

问题描述 投票:0回答:1

我有一个像这样的 FastAPI 端点:

@app.get("/api/triggers")
async def get_triggers(s_id: str = Query(None), trigger_id: str = None, limit: str = None, offset: int = None,
                    session: Session = Depends(get_db)):
    if trigger_id:
        if "," in trigger_id:
            trigger_id = trigger_id.replace(" ", "").split(',')
        else:
            trigger_id = [trigger_id]
        trigger_info = session.query(Trigger).filter(Trigger.id.in_(trigger_id)).offset(offset).limit(limit).all()
        for key in trigger_info:
            del key.geometry_global
        return trigger_info
    if s_id:
        if "," in s_id:
            s_id = s_id.split(',')
        else:
            s_id = [s_id]
        result = session.query(Trigger).options(load_only("id", "geometry_global")).offset(offset).limit(limit). \
            filter(Trigger.s_id_fk.in_(s_id)).all()
    else:
        result = session.query(Trigger).options(load_only("id", "geometry_global")).offset(offset).limit(limit).all()
    return ORJSONResponse(result)

如何加快速度?表中有数百万行,json 响应似乎很慢。我添加了分页,以便可以通过多个 api 调用检索数据块。但是有没有其他方法可以加快响应速度呢?

python json python-3.x fastapi
1个回答
0
投票

问题概述

如果您直接从 Web 浏览器访问端点,您可能遇到的延迟主要与浏览器显示数据有关,正如您提到的,需要返回数百万行;因此,这是一个客户端问题,而不是服务器端问题。

建议

  1. 您可以返回自定义的

    ORJSONResponse
    并使用
    Response
    参数设置
    Content-Disposition
    响应标头(向浏览器指示),而不是返回
    attachment
    (这会导致在浏览器中显示数据)数据应该作为文件“下载”,而不是在浏览器中“查看”。请查看这个答案,以及这里这里,了解有关返回 JSON 数据以及如何加快此过程的更多详细信息。示例: import orjson # ... results = session.query(... headers = {'Content-Disposition': 'attachment; filename="data.json"'} return Response(orjson.dumps(results), headers=headers, media_type="application/json")

    如果您仍然需要在浏览器中显示结果,我建议您使用一个前端(可以使用 Jinja2 模板和 HTML 轻松创建,如
    here
  2. here

    所示),而不是在以下位置获取所有结果一次(因为有数百万行,一次返回所有行没有任何意义),而是一次获取几行(例如 1000 行)并有一个 Load more 按钮,用户可以在该按钮上单击以获取更多结果(或使用分页)。此外,提供一种过滤机制,允许用户根据需要过滤结果,从而仅检索他们感兴趣的结果,从而加快查询执行速度并减少返回的数据。

© www.soinside.com 2019 - 2024. All rights reserved.