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
相关产品推荐
相关产品推荐

