如何在FastAPI中应用程序启动前添加中间件?

问题描述 投票:0回答:1

使用Lifespan EventsMiddleware,我想在

asynccontextmanager
内添加一个中间件。它看起来像这样:

@asynccontextmanager
async def lifespan(app: FastAPI):
    if some_condition:
        @app.middleware("http")
        async def my_middleware(request: Request, call_next):
            response = await call_next(request)
            return response
    yield
    pass


app = FastAPI(lifespan=lifespan)

但我明白了

RuntimeError: Cannot add middleware after an application has started
。但是,在寿命事件的开头,提到了:

您可以定义应该在之前执行的逻辑(代码) 应用程序启动。这意味着这段代码将被执行 一次,在应用程序启动之前接收请求。

我现在应该做什么?

python fastapi middleware startup starlette
1个回答
0
投票
您可以在应用程序启动时在

some_condition

 处理程序内的 
state
 上添加任意对象/变量,例如示例中的 
lifespan
,如 
这个答案这个答案: 中所示

from fastapi import FastAPI from contextlib import asynccontextmanager @asynccontextmanager async def lifespan(app: FastAPI): # Run at startup some_condition = ... yield {'some_condition': some_condition} # Run on shutdown
然后,照常定义您的 

http

 中间件 - 请参阅 
这个答案 作为示例 - 使用 some_condition
 访问 
request.state
 并在中间件内对其执行检查:

from fastapi import Request @app.middleware("http") async def some_middleware(request: Request, call_next): if request.some_condition: response = await call_next(request) return response else: pass
要将所有路由重定向到特定路由,正如您在之前的评论中提到的,您可能需要查看

这个答案,以及这个答案这个答案

© www.soinside.com 2019 - 2024. All rights reserved.