You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:15:06