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

Posted

技术标签:

【中文标题】Flask Blueprint AttributeError: \'module\' object has no attribute \'name\' 错误【英文标题】:Flask Blueprint AttributeError: 'module' object has no attribute 'name' errorFlask Blueprint AttributeError: 'module' object has no attribute 'name' 错误 【发布时间】:2014-12-20 10:12:06 【问题描述】:

我的 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"

如何解决AttributeError 问题,让我的app.register_blueprint 调用成功?

【问题讨论】:

【参考方案1】:

您正在尝试注册 模块 而不是包含的 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)

【讨论】:

我遇到了一个非常相似的错误,除了我只是想导入一个非常基本的蓝图而没有任何花哨的东西。 @DavidCrook:这基本上意味着您正在尝试注册不是实际的 Blueprint 实例。确保传入正确的对象。 我是 Blueprints 的新手,我遇到了同样的错误。是否会出现此错误,因为我对蓝图和蓝图所在的文件夹使用完全相同的名称?另外,我在哪里放置上述代码来传递蓝图对象?我有将导入应用程序作为应用程序导入的 run.py 文件,然后在较低级别的文件夹 init.py 中通过以下方式导入所有蓝图:从 app.i_statement 导入收入声明,并注册所有蓝图像这样导入代码行:app.register_blueprint(i_statement)。 @user3151858: income_statement 本身不是蓝图对象。我不知道它是什么类型的对象,所以我真的无能为力。【参考方案2】:

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

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

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

app.register_blueprint(api.blueprint)

【讨论】:

【参考方案3】:

我在一个项目中也经历过同样的效果。问题的根源是蓝图文件的错误导入。

确保 import 语句导入的是真正的蓝图,而不是定义它的模块。

换句话说,你可能正在做

from .blueprint import blueprint

你的意思

from .blueprint.blueprint import blueprint

作为附带建议,使用与蓝图本身不同的名称来命名定义蓝图的模块,以明确导入。一个例子:

from .blueprint.views import blueprint

【讨论】:

【参考方案4】:

我收到一条错误消息,提示 AttributeError: 'Blueprint' object has no attribute 'register_blueprint'

为此,我只是使用 pip uninstall flask 卸载了 Flask 然后安装flask[async] pip install flask[async]

【讨论】:

【参考方案5】:

我是直接导入蓝图from flask import Flask。我通过使用pip3 install flask 再次安装flask 解决了这个错误。有时,如果烧瓶版本大于或等于 0.12.3,您可能会遇到此问题。

【讨论】:

以上是关于Flask Blueprint AttributeError: 'module' object has no attribute 'name' 错误的主要内容,如果未能解决你的问题,请参考以下文章

flask中的蓝图 Blueprint

Flask:blueprint

Flask中的蓝图(BluePrint)

第六章 Flask——蓝图(BluePrint)对象

flask-蓝图(Blueprint)

Python进阶(四十九)-初识Flask Blueprint