2014-10-24 31 views
10

Benim geliştiricim, geliştiricilerin işlevselliğini genişletmesine izin vermek için geliştiriliyor. Planım, bunu Blueprints'e bırakabilecekleri bir "uzantılar" dizini sağlayarak bunu yapmak ve dinamik olarak yüklenecekler. Bu (bu tutorial den modifed) Ben ithal etmek kullanan ediyorum kodFlask Blueprint AttributeError: 'module' nesnesinin 'name' hatası yoktur

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) 

Bu projemin dizin düzeni olmasıdır. extensions dizini, geliştiricilerin genişletilmiş işlevlerinde yer aldıkları yerdir.

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

Sorun şu ki bu hatayı alıyorum ve bana ne söylediğinden emin değilim.

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

Basit uzantısı benim app.register_blueprint çağrı başarılı sağlayan bir şekilde AttributeError çözmek nasıl bu

from flask import Blueprint 

extension1 = Blueprint('extension1', __name__) 

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

benziyor?

cevap

15

modülünün modülünü kaydettirmeye çalışıyorsunuz ve içerilen Blueprint nesnesini.

yerine Blueprint örneklerini bulmak için modül iç gözlem gerekir: Sadece bu fancyness herhangi olmadan çok temel bir plan içe çalışıyorum hariç

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

Ben çok benzer bir hata alıyorum . –

+1

@DavidCrook: Temel olarak, gerçek bir "Blueprint" örneği olmayan bir şeyi kaydetmeye çalıştığınız anlamına gelir. Doğru nesneyi geçtiğinizden emin olun. –

İlgili konular