2014-10-24 2 views
10

Мой 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 вызов, чтобы преуспеть?

ответ

15

Вы пытаетесь зарегистрировать модуль , а не содержащийся объект 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) 
+1

Я получаю очень похожую ошибку, за исключением того, что я просто пытаюсь импортировать очень простой план без какого-либо из этого fancyness , –

+1

@DavidCrook: это в основном означает, что вы пытаетесь зарегистрировать что-то, что не является реальным экземпляром 'Blueprint'. Убедитесь, что вы проходите в нужном объекте. –

Смежные вопросы