python - flask 蓝图属性错误 : 'module' object has no attribute 'name' error

标签 python attributeerror flask

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

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

最佳答案

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

您需要自省(introspection)模块以查找 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)

关于python - flask 蓝图属性错误 : 'module' object has no attribute 'name' error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550180/

相关文章:

flask - AirPlay 弄乱了本地主机

python - `conda activate` 如何改变*当前* bash 环境?

python - 写入 'non-readable' 列表

python - `CDLL()` 如何找到只有文件基名的文件来加载?

python - AttributeError: 'Application' 对象没有属性 'tk'

python - 当模块分配给变量时如何使用模块中的方法

Python:是否有双端队列的线程安全版本?

python - AttributeError: 'Event' 对象没有属性 'key'

python - "Directory migrations already exists"在 Heroku 上初始化期间

postgresql - SQLALchemy "after_insert"不更新目标对象字段