有没有办法在FastAPI中漂亮地打印/美化JSON响应?

jhdbpxl9  于 2023-03-20  发布在  其他
关注(0)|答案(3)|浏览(206)

我正在寻找的东西是类似于 flask 的app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True .

kg7wmglp

kg7wmglp1#

这取自David Montague
您可以使用自定义响应类注解任何端点,例如

@app.get("/config", response_class=PrettyJSONResponse)
def get_config() -> MyConfigClass:
    return app.state.config

PrettyJSONResponse的示例可以是(indent=4是您要问的)

import json, typing
from starlette.responses import Response

class PrettyJSONResponse(Response):
    media_type = "application/json"

    def render(self, content: typing.Any) -> bytes:
        return json.dumps(
            content,
            ensure_ascii=False,
            allow_nan=False,
            indent=4,
            separators=(", ", ": "),
        ).encode("utf-8")
ws51t4hk

ws51t4hk2#

为了避免阻塞大型模型列表的事件循环,我最终使用了如下所示的解决方案。
这应当:
1.不阻塞事件循环
1.流式结果(更快)
1.模型dict操作之间的释放事件循环

async def streaming_output_json(content: List[BaseModel]) -> StreamingResponse:
    """
    Convert a list of Pydantic models to a JSON StreamingResponse.
    """
    async def jsonify_async(models: List[BaseModel]) -> AsyncIterable[str]:
        yield '['
        for i, model in enumerate(models):
            await asyncio.sleep(0)
            if i > 0:
                yield ','
            result_dict = jsonable_encoder(model)
            serialized_dict = json.dumps(result_dict)
            yield serialized_dict
        yield ']'

    return StreamingResponse(jsonify_async(models=content), media_type='application/json')

@router.get("")
async def get_huge_result():
    results = [model1, model2, ...]
    return await streaming_output_json(results)
anauzrmj

anauzrmj3#

我不知道你的问题到底是什么,你能告诉我你需要什么背景吗?
然而,因为FASTAPI是基于开放标准(OpenAPI,JSONSchema),它有自动文档。
您可以在 host/docs 下找到Swagger UI,或者在 host/redoc 下找到ReDoc这两种方法都可以轻松地提供JSON响应的漂亮表示。

相关问题