Мой API построен, чтобы позволить разработчикам расширять его функциональность. Мой план состоит в том, чтобы сделать это, предоставив каталог «расширений», где они могут попасть в «Чертежи», и они будут динамически загружаться. Это код, я, используя для импорта (доработанный из этого tutorial)Flask Blueprint AttributeError: объект 'module' не имеет атрибута 'name' error
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
вызов, чтобы преуспеть?
Я получаю очень похожую ошибку, за исключением того, что я просто пытаюсь импортировать очень простой план без какого-либо из этого fancyness , –
@DavidCrook: это в основном означает, что вы пытаетесь зарегистрировать что-то, что не является реальным экземпляром 'Blueprint'. Убедитесь, что вы проходите в нужном объекте. –