首页 文章

无法在其他文件中导入mongo对象

提问于
浏览
1

使用flask-restful,我无法将文件 app/__init__.py 中的对象 mongo = PyMongo() 导入 app/common/db.py .

我的 folder structure 看起来像这样:

myproject/
   run.py
   app/
      __init__.py
      config.py
      common/
         __init__.py
         db.py
      auth/
         __init__.py
         resources.py

app/init.py 包含:

from flask import Flask, Blueprint
from flask_pymongo import PyMongo
from flask_restful import Api
from app.config import Config

from app.auth.resources import Foo

mongo = PyMongo()

bp_auth = Blueprint('auth', __name__)
api_auth = Api(bp_auth)

api_auth.add_resource(Foo, '/foo/<string:name>')

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    mongo.init_app(app)

    app.register_blueprint(bp_auth)

    return app

app/common/db.py 包含:

from app import mongo

应用程序本身通过 run.py 从根运行,其中包含:

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

Problem:

运行应用程序我得到一个ImportError:

来自app import mongo ImportError:无法导入名称'mongo'

为什么这不起作用?

谢谢你的帮助!

编辑:

完全追溯:

Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from app import create_app
  File "/home/bt/Dropbox/dev/flask/test_api/app/__init__.py", line 13, in <module>
    from app.auth.resources import SignIn, Users, User, Foo
  File "/home/bt/Dropbox/dev/flask/test_api/app/auth/resources.py", line 8, in <module>
    from app.common.resources import AuthResource
  File "/home/bt/Dropbox/dev/flask/test_api/app/common/resources.py", line 3, in <module>
    from app.auth.decorators import token_required
  File "/home/bt/Dropbox/dev/flask/test_api/app/auth/decorators.py", line 6, in <module>
    from app.common.database import users
  File "/home/bt/Dropbox/dev/flask/test_api/app/common/database.py", line 1, in <module>
    from app import mongo
ImportError: cannot import name 'mongo'

1 回答

  • 1

    我怀疑,这是一个_1716696问题 .

    您可以跟踪查看跟踪的依赖关系的闭环:

    app -> resources -> database -> app
    

    这是一个常见的错误,并没有在Flask教程中正确记录 . 正如here by Lepture所解释的那样,你应该避免在 __init__.py 中声明db

    在编写模块和包时,我始终遵守这一规则:不要从根__init__.py向后导入 .

    你应该怎么做呢?

    • 在适当的模块中声明db( db.py

    • 导入它 inside 应用程序工厂

    我发现自己不愿意这种模式,我认为这些 import 语句不属于函数内部 . 但这是要走的路 .

    所以,你的文件看起来应该是相似的:

    app/common/db.py

    from flask_pymongo import PyMongo
    mongo = PyMongo
    

    app/init.py

    from flask import Flask
    ...
    
    def create_app(config_class=Config):
        app = Flask(__name__)
        app.config.from_object(config_class)
    
        from app.common.db import mongo
        mongo.init_app(app)
        ...
    

    当你需要数据库连接时,即在资源模块中,你应该像它一样导入它

    from app.common.db import mongo
    

    注意:为避免将来出现问题,您的蓝图也应在其他地方声明,并在创建时导入 . 我真的鼓励你阅读post by Lepture以更好地理解这种方法 .

相关问题