为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕无忌1623718 2023-08-22 10:19:07
我正在尝试使用自定义响应类作为默认响应。from fastapi.responses import Responsefrom bson.json_util import dumpsclass 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。
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

所以事实证明,默认响应类以及路由上的响应类仅适用于开放的 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"}

https://img1.sycdn.imooc.com//64e41b5000017b5310160683.jpg

从这个意义上说,我可能应该显式使用我的类并将默认响应类保留为 JSON,以便将它们记录为 JSON 响应。



查看完整回答
反对 回复 2023-08-22
?
慕后森

TA贡献1802条经验 获得超5个赞

我求助于猴子补丁


from fastapi import routing as fastapi_routing

from fastapi.responses import ORJSONResponse


def 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 decorator



fastapi_routing.APIRouter.api_route = api_route


查看完整回答
反对 回复 2023-08-22
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信