2014-10-24 15 views
10

Meine API wird gebaut, um es Entwicklern zu ermöglichen, ihre Funktionalität zu erweitern. Mein Plan ist, dies zu tun, indem ich ein "extensions" -Verzeichnis zur Verfügung stelle, in dem sie Blueprints fallen lassen können und sie dynamisch geladen werden. Dies ist der Code I (modifed von diesen tutorial)Flask Blueprint AttributeError: 'Modul' Objekt hat kein Attribut 'Name' Fehler

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) 

Dies ist die Verzeichnisstruktur von meinem Projekt zu importieren bin verwendet. Im Verzeichnis extensions geben Entwickler ihre erweiterte Funktionalität an.

/root 
    /extensions 
     /extension1 
      __init__.py 
      extension1.py 
     /extension2 
      __init__.py 
      extension2.py 
    simple_example.py 

Das Problem ist, dass ich diesen Fehler bekomme und bin mir nicht sicher, was es mir sagt.

>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' 

Eine einfache Erweiterung sieht wie folgt aus

from flask import Blueprint 

extension1 = Blueprint('extension1', __name__) 

@extension1.route("/my_route") 
def treasure_list(): 
    return "list of objects" 

Wie kann ich die AttributeError in einer Art und Weise zu lösen, die mein app.register_blueprint Anruf erlaubt erfolgreich zu sein?

Antwort

15

Sie versuchen, das Modul und nicht das enthaltene Objekt Blueprint zu registrieren.

Sie finden das Modul introspect müssen Blueprint Instanzen statt zu finden:

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

Ich bin eine sehr ähnliche Störung zu erhalten, es sei denn ich bin nur einen sehr grundlegenden Entwurf ohne irgendwelche dieses fancyness zu importieren versuchen, . –

+1

@DavidCrook: Es bedeutet im Grunde genommen, dass Sie versuchen, etwas zu registrieren, das keine tatsächliche "Blueprint" -Instanz ist. Stellen Sie sicher, dass Sie das richtige Objekt übergeben. –