使用Lifespan Events和Middleware,我想在
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
。但是,在寿命事件的开头,提到了:
我现在应该做什么?您可以定义应该在之前执行的逻辑(代码) 应用程序启动。这意味着这段代码将被执行 一次,在应用程序启动之前接收请求。
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
要将所有路由重定向到特定路由,正如您在之前的评论中提到的,您可能需要查看