私の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
オブジェクトではなく、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)
このエラーが発生すると、コードは次のようになります。
from blueprints import api
...
app.register_blueprint(api)
私はこれを行うことでこれを修正しました:
app.register_blueprint(api.blueprint)
プロジェクトでも同じ効果がありました。問題の原因は、ブループリントファイルの誤ったインポートでした。
Importステートメントが、それが定義されているモジュールではなく、実際のブループリントをインポートすることを確認してください。
つまり、あなたは
from .blueprint import blueprint
あなたが意味している間
from .blueprint.blueprint import blueprint
副次的な推奨事項として、インポートを明確にするために、ブループリントが定義されているモジュールにブループリント自体とは異なる名前を付けます。例:
from .blueprint.views import blueprint
ブループリントを直接インポートしていましたfrom flask import Flask
。 pip3 install flask
を使用してflaskを再インストールすることで、このエラーを解決しました。 flaskバージョンが0.12.3以上の場合、この問題が発生することがあります。