Python 无法在其他文件中导入mongo对象
使用flask restful,我无法将对象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
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文件夹中有什么?这似乎是一个循环输入。你能复制完整的回溯吗?当然,添加了回溯谢谢!你的回答帮了我很大的忙:)我试着遵循这一点,但它对我不起作用@苏森西奥,你能看一下吗