2014-10-24 25 views
10

API của tôi đang được xây dựng để cho phép các nhà phát triển mở rộng chức năng của nó. Kế hoạch của tôi là thực hiện điều này bằng cách cung cấp thư mục "tiện ích mở rộng" để họ có thể thả các Bản thiết kế và chúng sẽ được tải động. Đây là mã tôi đang sử dụng để nhập (được sửa đổi từ số này tutorial)Flask Blueprint AttributeError: đối tượng 'module' không có lỗi 'name' thuộc tính

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) 

Đây là bố cục thư mục của dự án của tôi. Thư mục extensions là nơi các nhà phát triển thả chức năng mở rộng của họ.

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

Vấn đề là tôi gặp lỗi này và không chắc chắn nó đang nói gì với tôi.

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

Một phần mở rộng đơn giản trông như thế này

from flask import Blueprint 

extension1 = Blueprint('extension1', __name__) 

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

Làm thế nào để giải quyết vấn AttributeError trong một cách mà cho phép app.register_blueprint cuộc gọi của tôi để thành công?

Trả lời

15

Bạn đang cố đăng ký mô-đun chứ không phải đối tượng Blueprint được chứa.

Bạn sẽ cần phải nội quan các mô-đun để tìm Blueprint trường hợp thay vì:

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

Tôi nhận được một lỗi rất giống nhau, ngoại trừ Tôi chỉ cố gắng để nhập khẩu một kế hoạch chi tiết rất cơ bản mà không cần bất kỳ fancyness rằng . –

+1

@DavidCrook: về cơ bản có nghĩa là bạn đang cố gắng đăng ký thứ gì đó không phải là thực tế 'Kế hoạch chi tiết'. Đảm bảo bạn vượt qua đúng đối tượng. –

Các vấn đề liên quan