Flask RestPlus报错:module 'app.api'无namespace属性求助
解决 AttributeError: module 'app.api' has no attribute 'namespace' 问题
嘿,我来帮你搞定这个报错!这个问题本质是循环导入加上变量初始化顺序不对导致的,咱们一步一步来解决:
问题根源分析
你看,在app.py的最顶部就直接导入了healthResource模块,但这时候app.py里的api = Api(...)还没执行呢!当healthResource.py试图从app导入api时,app模块里的api变量根本还没创建出来,自然就会报AttributeError说找不到namespace属性了。
解决方案一:调整导入顺序(快速修复)
把healthResource的导入延迟到api实例创建之后,也就是放到initialize_app函数内部:
修改app.py:
from flask import Flask, Blueprint from flask_restplus import Api app = Flask(__name__) # 先创建api实例 api = Api(version='1.0', title='flask-api-template', description='Flask RestPlus API Template Project') def initialize_app(flask_app): # 在这里才导入healthResource,此时api已经存在了 from api.main.resources.healthResource import ns as health_resource_ns blueprint = Blueprint('api', __name__, url_prefix='/api') api.init_app(blueprint) api.add_namespace(health_resource_ns) flask_app.register_blueprint(blueprint) def run(): initialize_app(app) app.run() if __name__ == '__main__': run()
healthResource.py保持不变,这样就能解决初始化顺序的问题了。
解决方案二:分离API实例(更规范的项目结构)
如果你的项目后续会扩展更多接口,推荐把api实例单独抽离到一个模块,彻底避免循环导入的问题:
- 创建
api/__init__.py文件,专门存放api实例:
from flask_restplus import Api # 在这里初始化api api = Api(version='1.0', title='flask-api-template', description='Flask RestPlus API Template Project')
- 修改
app.py,从新的api模块导入实例:
from flask import Flask, Blueprint from api import api app = Flask(__name__) def initialize_app(flask_app): from api.main.resources.healthResource import ns as health_resource_ns blueprint = Blueprint('api', __name__, url_prefix='/api') api.init_app(blueprint) api.add_namespace(health_resource_ns) flask_app.register_blueprint(blueprint) def run(): initialize_app(app) app.run() if __name__ == '__main__': run()
- 修改
healthResource.py,同样从api模块导入实例:
from flask_restplus import Resource from api import api ns = api.namespace('/health', description='API Health Resource') @ns.route("/") class HealthResource(Resource): def get(self): return "Success"
额外提醒
顺便说一句,Flask-RESTPlus已经停止维护啦,现在官方推荐使用Flask-RESTX(它是RESTPlus的分支,完全兼容原有代码),如果你的项目还在初期,建议迁移过去,后续能得到更好的支持。
内容的提问来源于stack exchange,提问作者Aaron S.
相关产品推荐
相关产品推荐

