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

Flask项目中Dependency Injector未注入容器,报AttributeError错误求助

问题解决:AttributeError: 'Provide' object has no attribute 'get_expense'

核心原因

该错误是因为Dependency Injector的容器未完成初始化与启动,Provide["repository"]仅作为依赖标记存在,并未被替换为实际的FakeExpenseRepository实例,导致调用get_expense时操作的是Provide对象而非仓库实例。

分步解决方案

1. 初始化并启动容器

修改app.py,导入容器并完成初始化启动流程:

from flask import Flask
from web_app.blueprints import get_expense
from di.config import Application

# 初始化容器并启动资源
container = Application()
container.init_resources()
container.wire(modules=[__name__])

app = Flask(__name__)
app.register_blueprint(get_expense.bp)

# 可选:将容器挂载到Flask实例,方便后续扩展使用
app.container = container

2. 修复蓝图变量名冲突与缺失依赖

你的蓝图路由函数名get_expense与导入的services.get_expense模块重名,会覆盖模块引用导致调用出错;同时未导入request对象,会引发额外错误。修改blueprints/get_expense.py:

from flask import Blueprint, jsonify, request
from services import get_expense

bp = Blueprint("get_expense", __name__)

@bp.route("/expense", methods=["GET", "POST"])
def fetch_expense():  # 修改函数名避免与模块重名
    expense_id = request.json.get("expense_id")
    if not expense_id:
        return jsonify({"error": "expense_id is required"}), 400
    
    expense = get_expense.execute(expense_id)
    if expense:
        return jsonify({"expense": expense})
    return jsonify({"error": "Expense not found"}), 404

3. 验证容器 wiring 配置

确认wiring_config.py中的模块路径正确,当前配置["services.get_expense"]符合项目结构,但需确保模块能被Python解释器正确识别导入。

额外检查点

  • 确认FakeExpenseRepository类已正确实现AbstractExpenseRepository中的get_expense方法,方法名拼写无错误。
  • 检查容器配置config.py中repository = providers.Singleton(FakeExpenseRepository)的类名、变量名拼写正确。

内容的提问来源于stack exchange,提问作者Tomas Rojo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:34:54