我的 API 正在构建以允许开发人员扩展它的功能。我的计划是通过提供一个“扩展”目录来实现这一点,它们可以在其中放入蓝图并动态加载它们。这是我用来导入的代码(从 tutorial 修改)
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"
如何以允许我的 app.register_blueprint
调用成功的方式解决 AttributeError
?
最佳答案
您正在尝试注册 模块 而不是包含的 Blueprint
对象。
您需要自省(introspection)模块以查找 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)
关于python - flask 蓝图属性错误 : 'module' object has no attribute 'name' error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26550180/