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

