使用flask-restful,我无法将文件 app/__init__.py
中的对象 mongo = PyMongo()
导入 app/common/db.py
.
我的 folder structure 看起来像这样:
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)
Problem:
运行应用程序我得到一个ImportError:
来自app import 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'
1 回答
我怀疑,这是一个_1716696问题 .
您可以跟踪查看跟踪的依赖关系的闭环:
这是一个常见的错误,并没有在Flask教程中正确记录 . 正如here by Lepture所解释的那样,你应该避免在
__init__.py
中声明db你应该怎么做呢?
在适当的模块中声明db(
db.py
)导入它 inside 应用程序工厂
我发现自己不愿意这种模式,我认为这些
import
语句不属于函数内部 . 但这是要走的路 .所以,你的文件看起来应该是相似的:
app/common/db.py
app/init.py
当你需要数据库连接时,即在资源模块中,你应该像它一样导入它
注意:为避免将来出现问题,您的蓝图也应在其他地方声明,并在创建时导入 . 我真的鼓励你阅读post by Lepture以更好地理解这种方法 .