【问题标题】:Can not import mongo object in other file无法在其他文件中导入 mongo 对象
【发布时间】:2018-09-18 17:32:07
【问题描述】:

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

我的文件夹结构如下所示:

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)

问题:

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

从应用导入 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'

【问题讨论】:

  • auth 文件夹中有什么?这似乎是一个循环导入。你能复制完整的回溯吗?
  • 当然添加了traceback

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


【解决方案1】:

正如我所怀疑的,这是一个循环导入问题。

你可以通过traceback来跟踪依赖的闭环:

app -> resources -> database -> app

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

在编写模块和包时,我始终遵守这一规则:

不要从根 __init__.py 向后导入。

那你应该怎么做呢?

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2021-01-24
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多