fastapi 自定义响应类作为默认响应类

我正在尝试使用自定义响应类作为默认响应。

from fastapi.responses import Response

from bson.json_util import dumps


class MongoResponse(Response):

    def __init__(self, content, *args, **kwargs):

        super().__init__(

            content=dumps(content),

            media_type="application/json",

            *args,

            **kwargs,

        )

当我明确使用响应类时,这工作得很好。


@app.get("/")

async def getDoc():

    foo = client.get_database('foo')

    result = await foo.bar.find_one({'author': 'fool'})

    return MongoResponse(result)

但是,当我尝试将其作为参数传递给 FastAPI 构造函数时,仅在从请求处理程序返回数据时似乎不会使用它。


app = FastAPI(default_response_class=MongoResponse)


@app.get("/")

async def getDoc():

    foo = client.get_database('foo')

    result = await foo.bar.find_one({'author': 'fool'})

    return result

当我查看下面的堆栈跟踪时,它似乎仍在使用正常的默认响应,即json response。



慕无忌1623718
浏览 191回答 2
2回答

炎炎设计

所以事实证明,默认响应类以及路由上的响应类仅适用于开放的 API 文档。默认情况下,文档将记录每个端点,就像它们返回 json 一样。因此,使用下面的示例代码,每个响应都将被标记为内容类型 text/html。在第二次路由中,这被 application/json 覆盖app = FastAPI(default_response_class=HTMLResponse)@app.get("/")async def getDoc():    foo = client.get_database('foo')    result = await foo.bar.find_one({'author': 'Mike'})    return MongoResponse(result)@app.get("/other", response_class=JSONResponse)async def json():    return {"json": "true"}从这个意义上说,我可能应该显式使用我的类并将默认响应类保留为 JSON,以便将它们记录为 JSON 响应。

慕后森

我求助于猴子补丁from fastapi import routing as fastapi_routingfrom fastapi.responses import ORJSONResponsedef api_route(self, path, **kwargs):    def decorator(func):        if type(kwargs["response_class"]) == DefaultPlaceholder:            kwargs["response_class"] = Default(ORJSONResponse)        self.add_api_route(            path,            func,            **kwargs,        )        return func    return decoratorfastapi_routing.APIRouter.api_route = api_route
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python