web-dev-qa-db-ja.com

Flask Blueprint AttributeError: 'module' object has no attribute 'name' error

私の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を解決するにはどうすればよいですか?

22
NewGuy

含まれているBlueprintオブジェクトではなく、moduleを登録しようとしています。

代わりに、モジュールをイントロスペクトして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)
33
Martijn Pieters

このエラーが発生すると、コードは次のようになります。

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

私はこれを行うことでこれを修正しました:

app.register_blueprint(api.blueprint)
3
Kit

プロジェクトでも同じ効果がありました。問題の原因は、ブループリントファイルの誤ったインポートでした。

Importステートメントが、それが定義されているモジュールではなく、実際のブループリントをインポートすることを確認してください。

つまり、あなたは

from .blueprint import blueprint

あなたが意味している間

from .blueprint.blueprint import blueprint

副次的な推奨事項として、インポートを明確にするために、ブループリントが定義されているモジュールにブループリント自体とは異なる名前を付けます。例:

from .blueprint.views import blueprint
1
rummidge

ブループリントを直接インポートしていましたfrom flask import Flaskpip3 install flaskを使用してflaskを再インストールすることで、このエラーを解決しました。 flaskバージョンが0.12.3以上の場合、この問題が発生することがあります。

0
Owais Kazi