任务
我想编写将数据添加到最终响应的中间件。也就是说,这个答案:
{
"user": ...,
"some_field": ...
}
它应该变成这样:
{
"some_additional_field": ...,
"data": {
"user": ...,
"some_field": ...
}
}
为此我编写了中间件:
class ResponseFormatterMiddleware:
async def _post_process_response(self, response: Response) -> Response:
response.body = response.render({
"some_additional_field": 123,
"data": response.body
})
return response
async def __call__(self, request: Request, call_next) -> Response:
response = await call_next(request)
return await self._post_process_response(response)
并添加它:
app.middleware("http")(ResponseFormatterMiddleware())
但我收到一个错误:
AttributeError: '_StreamingResponse' object has no attribute 'body'
之后我发现我收到的输入不是fastapi.Request
, but starlette.middleware.base._CachedRequest
,但是执行控制器后我收到的输入不是fastapi.Response
, but starlette.middleware.base._StreamingResponse
。
问题)
是否可以像 django 中那样做 +- ?也就是说,使用中间件将附加信息写入请求中,然后以某种方式更改最终响应。
是否有可能以某种方式使用对象fastapi
而不是starlette
中间件?