私の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"
通話を成功させるAttributeError
方法でを解決するにはどうすればよいapp.register_blueprint
ですか?
含まれているオブジェクトではなく、モジュールを登録しようとしてい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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加