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

Python fastapi自定义响应类作为默认响应类,python,python-3.x,fastapi,Python,Python 3.x,Fastapi,我正在尝试使用自定义响应类作为 来自fastapi.responses导入响应 从bson.json_util导入转储 类别MongoResponse(回应): 定义初始化(self,content,*args,**kwargs): 超级()。\uuu初始化__( 内容=转储(内容), 媒体类型=“应用程序/json”, *args, **夸尔斯, ) 当我显式地使用response类时,这可以很好地工作 @app.get(“/”) 异步def getDoc(): foo=client.get

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

来自fastapi.responses导入响应
从bson.json_util导入转储
类别MongoResponse(回应):
定义初始化(self,content,*args,**kwargs):
超级()。\uuu初始化__(
内容=转储(内容),
媒体类型=“应用程序/json”,
*args,
**夸尔斯,
)
当我显式地使用response类时,这可以很好地工作

@app.get(“/”)
异步def getDoc():
foo=client.get\u数据库('foo')
结果=等待foo.bar.find_one({'author':'fool'})
返回MongoResponse(结果)
但是,当我尝试将此作为参数传递给FastAPI构造函数时,似乎在仅从请求处理程序返回数据时不使用它

app=FastAPI(默认响应类=MongoResponse)
@app.get(“/”)
异步def getDoc():
foo=client.get\u数据库('foo')
结果=等待foo.bar.find_one({'author':'fool'})
返回结果
当我查看下面的堆栈跟踪时,它似乎仍在使用正常的默认响应,即

错误:ASGI应用程序中出现异常
回溯(最近一次呼叫最后一次):
文件“/home/blue/podman/test/.venv/lib/python3.6/site-packages/uvicorn/protocols/http/httptools\u impl.py”,第390行,在run\u asgi中
结果=等待应用程序(self.scope、self.receive、self.send)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/uvicorn/middleware/proxy\u headers.py”,第45行,在调用中__
返回等待自我应用程序(范围、接收、发送)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/fastapi/applications.py”,第181行,在调用中__
等待super()。uu调用(作用域、接收、发送)#pragma:无掩护
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/applications.py”,第111行,在调用中__
等待self.middleware\u堆栈(作用域、接收、发送)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/middleware/errors.py”,第181行,在调用中__
将exc从零提高到零
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/middleware/errors.py”,第159行,在调用中__
等待self.app(范围、接收、发送)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/exceptions.py”,第82行,在调用中__
将exc从零提高到零
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/exceptions.py”,第71行,在调用中__
等待self.app(范围、接收、发件人)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/routing.py”,第566行,在调用中__
等待路由。处理(范围、接收、发送)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/routing.py”,第227行,在handle中
等待self.app(范围、接收、发送)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/starlette/routing.py”,第41行,应用程序中
响应=等待功能(请求)
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/fastapi/routing.py”,第199行,应用程序中
is_coroutine=is_coroutine,
文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/fastapi/routing.py”,第122行,在序列化_响应中
返回JSU编码器(响应内容)
JSU编码器中的文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/fastapi/encoders.py”,第94行
sqlalchemy_safe=sqlalchemy_safe,
JSU编码器中的文件“/home/blue/podman/test/.venv/lib/python3.6/site packages/fastapi/encoders.py”,第139行
提升值错误(错误)
ValueError:[TypeError(“'ObjectId'对象不可编辑“,”),TypeError('vars()参数必须具有_dict__属性',)]

因此,默认响应类以及路由上的响应类仅用于openapi文档。默认情况下,文档将记录每个端点,就像它们将返回json一样

因此,使用下面的示例代码,每个响应都将标记为内容类型text/html。 在第二个路由上,它被application/json覆盖

app=FastAPI(默认响应类=HTMLResponse)
@app.get(“/”)
异步def getDoc():
foo=client.get\u数据库('foo')
result=wait foo.bar.find_one({'author':'Mike'})
返回MongoResponse(结果)
@app.get(“/other”,response\u class=JSONResponse)
异步def json():
返回{“json”:“true”}

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