无法在其他文件中导入 mongo 对象
Can not import mongo object in other file
使用 flask-restful,我无法将文件 app/__init__.py
中的对象 mongo = PyMongo()
导入 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:
from app import mongo
ImportError: cannot import name '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'
如我所料,这是一个循环导入问题。
您可以查看回溯来跟踪依赖关系的闭环:
app -> resources -> database -> app
这是一个常见错误,在 Flask 教程中没有正确记录。如 here by Lepture 所述,您应该避免在 __init__.py
中声明 db
I always keep this one certain rule when writing modules and packages:
Don't backward import from root __init__.py
.
那你应该怎么做呢?
- 在正确的模块中声明数据库 (
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 以更好地理解这种方法。
使用 flask-restful,我无法将文件 app/__init__.py
中的对象 mongo = PyMongo()
导入 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:
from app import mongo
ImportError: cannot import name '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'
如我所料,这是一个循环导入问题。
您可以查看回溯来跟踪依赖关系的闭环:
app -> resources -> database -> app
这是一个常见错误,在 Flask 教程中没有正确记录。如 here by Lepture 所述,您应该避免在 __init__.py
I always keep this one certain rule when writing modules and packages:
Don't backward import from root
__init__.py
.
那你应该怎么做呢?
- 在正确的模块中声明数据库 (
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 以更好地理解这种方法。