【发布时间】:2022-06-17 16:10:11
【问题描述】:
我有一个 FastAPI app,在应用启动时,我为它创建了一个 State,如下所示:
app.state.player["id"] = Player()
现在我想在需要时访问这个player 状态。访问此状态的唯一方法是通过 fastapi.Request 对象,如下所示:
request.app.state.player["id"]
我试过了:
def _return_player(request: Request):
return request.app.state.player["id"]
async def process_new_player(player: Player = Depends(_return_player)):
await player.play()
但显然fastapi.Depends 只能在路由器方法中使用。
然后我想做这样的事情:
async def process_new_player():
player = request.app.state.player["id"]
await player.play()
但我还是不确定如何获得fastapi.Request 的值。不,process_new_player 方法一开始并没有从任何路由器启动(如果是这种情况,我可以将fastapi.Request 对象递归地传递到这里)。
如何在process_new_player 方法中访问request.app.state.player["id"] 的值?
我已经知道 starlette-context 库,但我想要一个没有第三方的解决方案和一个更简单的解决方案。
谢谢!
【问题讨论】:
-
如果这是要在 FastAPI 上下文之外使用的应用程序范围的变量,那么首先将其附加到(然后尝试在外部使用)FastAPI 对象的原因是什么地方?你怎么打电话给
process_new_player? (即,是否有任何理由不在应用程序启动时调用它,并在其中附加状态变量?)很难理解用例与“只是”在 FastAPI 应用程序对象之外拥有一个状态容器相比。 /跨度> -
我认为我只能通过
Request对象访问State对象是错误的。我刚刚通过app.state.player["id"]访问了player状态。你不需要Depends或Request。