用了几天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