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

时间:2018-09-18 08:50:19

标签: python python-3.x flask flask-restful flask-pymongo

使用烧瓶时,我无法将对象INNER JOIN从文件mongo = PyMongo()导入到app/__init__.py

我的 文件夹结构 如下:

app/common/db.py

app / __ init __。py 包含:

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

app / common / db.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

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

from app import mongo

问题:

运行该应用程序时,我收到一个ImportError:

  

从应用程序导入mongo

     

ImportError:无法导入名称'mongo'

为什么这不起作用?

感谢您的帮助!

编辑:

完整追溯:

from app import create_app

app = create_app()

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

1 个答案:

答案 0 :(得分:1)

我怀疑这是一个循环导入问题。

您可以查看回溯来跟踪依赖项的闭环:

app -> resources -> database -> app

这是一个常见错误,未在Flask教程中正确记录。如here by Lepture所述,您应该避免在__init__.py

中声明db
  

在编写模块和软件包时,我始终遵循这一特定规则:

     

请勿从根__init__.py向后导入。

那你应该怎么做?

  • 在适当的模块(db.py)中声明db
  • 将其导入内部应用程序工厂

我发现自己不喜欢这种模式,我认为那些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,以更好地理解这种方法。