Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法在其他文件中导入mongo对象_Python_Python 3.x_Flask_Flask Restful_Flask Pymongo - Fatal编程技术网

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

Python 无法在其他文件中导入mongo对象,python,python-3.x,flask,flask-restful,flask-pymongo,Python,Python 3.x,Flask,Flask Restful,Flask Pymongo,使用flask restful,我无法将对象mongo=PyMongo()从文件app/\uu init\uuuuuuuuuuuuuuuuuuupy导入app/common/db.py 我的文件夹结构如下所示: myproject/ run.py app/ __init__.py config.py common/ __init__.py db.py auth/ __init__.p

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

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

myproject/
   run.py
   app/
      __init__.py
      config.py
      common/
         __init__.py
         db.py
      auth/
         __init__.py
         resources.py
app/\uuuu init\uuuuu.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
from app import mongo
from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)
应用程序本身通过run.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
from app import mongo
from app import create_app

app = create_app()

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

运行应用程序时,我会收到一个提示:

从应用程序导入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'
回溯(最近一次呼叫最后一次):
文件“run.py”,第1行,在
从应用程序导入创建应用程序
文件“/home/bt/Dropbox/dev/flask/test_api/app/_init__.py”,第13行,在
从app.auth.resources导入登录、用户、用户、Foo
文件“/home/bt/Dropbox/dev/flask/test_api/app/auth/resources.py”,第8行,在
从app.common.resources导入AuthResource
文件“/home/bt/Dropbox/dev/flask/test_api/app/common/resources.py”,第3行,在
从app.auth.decorators导入令牌\u需要
文件“/home/bt/Dropbox/dev/flask/test_api/app/auth/decorators.py”,第6行,在
从app.common.database导入用户
文件“/home/bt/Dropbox/dev/flask/test_api/app/common/database.py”,第1行,在
从应用程序导入mongo
ImportError:无法导入名称“mongo”

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

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

app -> resources -> database -> app
这是一个常见错误,没有在Flask教程中正确记录。如前所述,您应该避免在
\uuuu init\uuuuuuu.py

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

不从根目录反向导入
\uuuuu init\uuuuuu.py

那你该怎么做呢

  • 在适当的模块中声明db(
    db.py
  • 在应用程序工厂内部导入它
我发现自己不愿意使用这种模式,我认为那些
import
语句不属于函数内部。但这是一条路要走

因此,您的文件应该看起来很像:

app/common/db.py

from flask_pymongo import PyMongo
mongo = PyMongo
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)
    ...
app/\uuuu init\uuuuu.py

from flask_pymongo import PyMongo
mongo = PyMongo
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

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

auth文件夹中有什么?这似乎是一个循环输入。你能复制完整的回溯吗?当然,添加了回溯谢谢!你的回答帮了我很大的忙:)我试着遵循这一点,但它对我不起作用@苏森西奥,你能看一下吗