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

FastAPI依赖注入的实例复用问题咨询

FastAPI依赖注入的实例复用问题咨询

嗨,我来帮你理清这个问题~

首先直接给你答案:你当前的代码里,每次访问/example接口都会创建一个新的MyDependency实例。原因很简单,你用的是普通函数get_dependency()作为依赖提供者,FastAPI默认的行为就是在每次请求触发时调用这个依赖函数,自然每次都会生成新的实例对象。

那要怎么实现实例复用,让所有请求共享同一个MyDependency实例呢?这里有几种常用的靠谱方案:

方案一:用lru_cache缓存依赖实例

这是最简单的实现方式,给你的get_dependency()函数加上functools.lru_cache装饰器,让函数缓存第一次创建的实例,后续调用直接返回缓存的对象:

from fastapi import Depends, FastAPI
from functools import lru_cache

class MyDependency:
    def __init__(self):
        # 初始化逻辑只会在第一次创建实例时执行
        pass

    def some_method(self):
        pass

@lru_cache()
def get_dependency():
    return MyDependency()

app = FastAPI()

@app.get("/example")
def example(dependency: MyDependency = Depends(get_dependency)):
    dependency.some_method()

⚠️ 注意:如果你的MyDependency类里有可变的状态(比如存储请求相关的数据),要留意线程安全问题——毕竟FastAPI是异步框架,多个请求可能会同时操作这个共享实例。

方案二:给依赖类实现单例模式

通过重写类的__new__方法,强制全局只生成一个实例,然后直接把类作为依赖使用:

from fastapi import Depends, FastAPI

class MyDependency:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 把初始化逻辑放在这里,避免__init__被多次调用
            cls._instance._init()
        return cls._instance

    def _init(self):
        # 真正的初始化操作,仅执行一次
        pass

    def some_method(self):
        pass

app = FastAPI()

@app.get("/example")
def example(dependency: MyDependency = Depends(MyDependency)):
    dependency.some_method()

这种方式把单例逻辑封装在类内部,代码结构更清晰。

方案三:提前创建全局实例

直接在代码里提前创建好MyDependency的实例,然后让依赖函数直接返回这个全局对象:

from fastapi import Depends, FastAPI

class MyDependency:
    def __init__(self):
        pass

    def some_method(self):
        pass

# 提前初始化全局唯一实例
my_shared_dep = MyDependency()

def get_dependency():
    return my_shared_dep

app = FastAPI()

@app.get("/example")
def example(dependency: MyDependency = Depends(get_dependency)):
    dependency.some_method()

这个方案最直观,但要确保实例的初始化逻辑在FastAPI应用创建前完成,避免出现未初始化的问题。

备注:内容来源于stack exchange,提问作者Michael Xia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:18:13