Flask Blueprint AttributeError: 'module' object has no attribute 'name' 错误

新手上路,请多包涵

我的 API 正在构建以允许开发人员扩展它的功能。我的计划是通过提供一个“扩展”目录来实现这一点,它们可以放入蓝图并动态加载。这是我用来导入的代码(根据本 教程 修改)

 from flask import Flask

import pkgutil
import sys

app = Flask(__name__)

EXTENSIONS_DIR = "extensions"
modules = pkgutil.iter_modules(path=[EXTENSIONS_DIR])
for loader, mod_name, ispkg in modules:
    if mod_name not in sys.modules:
        # It imports fine
        loaded_mod = __import__(EXTENSIONS_DIR+"."+mod_name+"."+mod_name, fromlist=[mod_name])
        # It does not register
        app.register_blueprint(loaded_mod)

这是我的项目的目录布局。 extensions 目录是开发人员放置扩展功能的地方。

 /root
    /extensions
        /extension1
            __init__.py
            extension1.py
        /extension2
            __init__.py
            extension2.py
    simple_example.py

问题是我收到此错误,但不确定它在告诉我什么。

 >python simple_example.py
Traceback (most recent call last):
  File "simple_example.py", line 14, in <module>
    app.register_blueprint(loaded_mod)
  File "C:\Python27\lib\site-packages\flask\app.py", line 62, in wrapper_func
    return f(self, *args, **kwargs)
  File "C:\Python27\lib\site-packages\flask\app.py", line 880, in register_blueprint
    if blueprint.name in self.blueprints:
AttributeError: 'module' object has no attribute 'name'

一个简单的扩展看起来像这样

from flask import Blueprint

extension1 = Blueprint('extension1', __name__)

@extension1.route("/my_route")
def treasure_list():
    return "list of objects"

如何以允许我的 app.register_blueprint 调用成功的方式解决 AttributeError 调用?

原文由 NewGuy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您正在尝试注册 模块 而不是包含的 Blueprint 对象。

您需要反省模块以找到 Blueprint 实例:

 if mod_name not in sys.modules:
    loaded_mod = __import__(EXTENSIONS_DIR+"."+mod_name+"."+mod_name, fromlist=[mod_name])
    for obj in vars(loaded_mod).values():
        if isinstance(obj, Blueprint):
            app.register_blueprint(obj)

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

当我收到此错误时,我的代码如下所示:

 from blueprints import api
...
app.register_blueprint(api)

我通过这样做解决了这个问题:

 app.register_blueprint(api.blueprint)

原文由 Kit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题