本文主要是介绍Flask 3.x + dependency-injector 4.xAttributeError: ‘Provide‘ object has no attribute ‘xxxx‘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
用了几天flask+dependency-injector,之前都好好的,今天在规范项目结构而且加了一堆代码之后突然出现了这个错,心想不会啊,之前都好好的,chatGPT, new bing ,stackoverflow都问遍了,就是找不到正确的解决方案,回家之后一点点的rollback检查,终于发现问题所在了.
首先呢先说说一般的解决方法:
这就是初学的时候很容易犯的一个错误,编译器不会告诉你错了,启动项目也没问题,知道call到这个api了就会报这个错.
from flask import Blueprint
from dependency_injector.wiring import inject, Providefrom main.service.user_services import UserService
from main.containers import Containerdb_bp=Blueprint('db',__name__)@db_bp.route('/create_user')
def create_user(user_service:UserService=Provide[Container.user_service]):return user_service.create_user().to_string()
那就是忘记加 @inject
from flask import Blueprint
from dependency_injector.wiring import inject, Providefrom main.service.user_services import UserService
from main.containers import Containerdb_bp=Blueprint('db',__name__)
@inject
@db_bp.route('/create_user')
def create_user(user_service:UserService=Provide[Container.user_service]):return user_service.create_user().to_string()
还有一种情况就是在Containers 中定义的问题,这里我就不展示了,只是把Containers 贴出来,这里一般就是忘记定义而已,很好检查
"""Containers module."""from dependency_injector import containers, providersfrom main.config.database_config import DatabaseConfig
from main.config.storage_config import StorageConfig
from main.repository.user_repositories import UserRepository
from main.service.user_services import UserService
from .beanFactory import BeanFactoryclass Container(containers.DeclarativeContainer):wiring_config = containers.WiringConfiguration(packages=["main.db","main",])config = providers.Configuration(yaml_files=["config.yml"])db=providers.Singleton(DatabaseConfig,db_url=config.db.url)storage=providers.Singleton(StorageConfig,storage_config=config.storage)storage = providers.Factory(storage.provided.getStorageService)user_repository = providers.Factory(UserRepository,session_factory=db.provided.session,)user_service = providers.Factory(UserService,user_repository=user_repository,)
重头戏来了
我遇到当然不属于这里的任何一种,我发现我在整理项目结构的时候,把blueprint往目录深处放了,之前是和application.py同一目录,现在出问题了,就怀疑是目录的问题,移出来之后果然不报错了.然后一点一点排查,发现了问题根源,那就是 __init__.py ,他是用来告诉python这是一个包的.
我修改目录结构之后是这样的
/application.py
/web/controller__init__.pyblueprint.py
在application.py里面引入也是没问题的 from .web.controller.blueprint import bp
但是其实问题就出在目录里面,我/controller目录里面有__init__.py没错,但是/web里面没有放,就导致了这个问题.
修改成这样,就可以完美解决了.
记住修改之后需要重新启动项目,热部署不会加载到这个改动.
/application.py
/web__init__.py/controller__init__.pyblueprint.py
这篇关于Flask 3.x + dependency-injector 4.xAttributeError: ‘Provide‘ object has no attribute ‘xxxx‘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!