如何在FastAPI每次请求时于wrapper前执行装饰器逻辑?
解决方案
你的核心问题是:当前decorator函数里的代码是在应用启动、路由注册阶段执行的(仅运行一次),而你需要的是每次HTTP请求时执行的逻辑,这部分代码必须放到wrapper函数内部——因为wrapper才是每次请求到来时会被调用的函数。
修改后的代码如下:
from functools import wraps import uvicorn from fastapi import FastAPI, Depends app = FastAPI() def get_session(): print("get session") def transaction(): print("inside transaction") def decorator(func): print("inside decorator") # 这行仍为启动时执行一次 @wraps(func) async def wrapper(*args, **kwargs): # ===> 这里的代码会在每次请求时、wrapper执行前运行 print("每次请求前执行的初始化代码") print("inside wrapper") result = await func(*args, **kwargs) return result return wrapper return decorator @app.post("/create") @transaction() async def create(session=Depends(get_session)): pass if __name__ == '__main__': uvicorn.run(app, port=8000)
执行效果验证
启动后发送请求,输出会变成:
inside transaction inside decorator INFO: Started server process [xxxx] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) 每次请求前执行的初始化代码 inside wrapper get session
补充说明
如果你的初始化逻辑需要在依赖项(比如get_session)执行前运行,上述写法完全满足——因为func(*args, **kwargs)调用时才会触发Depends依赖的解析,所以wrapper里的代码会先于依赖执行。
如果你的逻辑需要作用于所有路由,也可以考虑使用FastAPI的中间件,但针对单个路由的话,修改装饰器的wrapper是最直接的方式。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

