Flask 3.x AttributeError: ‘Provide‘ object has no attribute ‘xxxx‘

用了几天flask,之前都好好的,今天在规范项目结构而且加了一堆代码之后突然出现了这个错,心想不会啊,之前都好好的,chatGPT, new bing ,stackoverflow都问遍了,就是找不到正确的解决方案,回家之后一点点的rollback检查,终于发现问题所在了.

首先呢先说说一般的解决方法:

这就是初学的时候很容易犯的一个错误,编译器不会告诉你错了,启动项目也没问题,知道call到这个api了就会报这个错.


from flask import  Blueprint
from dependency_injector.wiring import inject, Provide

from main.service.user_services import UserService
from main.containers import Container

db_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, Provide

from main.service.user_services import UserService
from main.containers import Container

db_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, providers

from 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 BeanFactory


class 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__.py
        blueprint.py
    

 在application.py里面引入也是没问题的 from .web.controller.blueprint import bp

但是其实问题就出在目录里面,我/controller目录里面有__init__.py没错,但是/web里面没有放,就导致了这个问题. 

修改成这样,就可以完美解决了.

记住修改之后需要重新启动项目,热部署不会加载到这个改动.

/application.py
/web
    __init__.py
    /controller
        __init__.py
        blueprint.py
    

你可能感兴趣的:(Python,flask,flask,python,后端)