我正在研究中型烧瓶应用。我有两个主要模块,一个用于创建数据库,另一个用于称为schema.py,另一个用于提供视图,views.py。我在http://flask.pocoo.org/docs/patterns/packages/中使用建议的结构
我在app
中定义了db=SQLAlchemy(app)
和__init__.py
。我在这里看到循环导入问题!以下是我的文件导入:
schema
吡啶:
from myapp import db
views
吡啶:
from myapp import app,db
import myapp.schema
__init__
。PY
import myapp.views
因此,当我运行schema.py时,我将收到循环导入错误。我该怎么解决这个问题?我很感激任何建议。
答案 0 :(得分:3)
哦,是的,我们也经常遇到循环导入,但解决问题的方法是创建文档中的应用程序工厂。
http://flask.pocoo.org/docs/patterns/appfactories/
您还可以考虑创建另一个模块或其他地方来输入组件。一个很好的例子是使用SQLAlchemy作为例子。
#: SQLalchemy object created without an attached app
db = SQLAlchemy()
def create_app():
app = Flask(__name__)
#: some configuration stuff
#: Initializing app.
db.init_app(app)
return app
如果需要,您可以将组件放在另一个模块中以使它们更加分离,但这是我们发现“帮助”阻止循环导入的最简单方法。
答案 1 :(得分:1)
在烧瓶中有一个名为g
的物体,还有一个名为current_app
的物体。简单语言的current_app
是您在init或任何文件中创建的应用程序(初始化应用程序),之后它代表您的应用程序,如果导入from flask import current_app
,您可以使用它。当然有一些限制,但是例如,如果你需要达到应用程序的设置 - 这将有助于确保。
关于g
- 这是保持数据库连接等内容的好地方,并且可以在应用程序周围随处可见。如果您在__init__.py
中的内容有:
from flask import g
g.db = connect_to_some_db(...)
然后在其他需要使用数据库连接的地方 - 简单:
from flask import g
# do something with your db
g.db.some_method_or_whatever(...)
答案 2 :(得分:1)
来自http://flask.pocoo.org/docs/patterns/packages/ :(添加突出显示)
每个Python程序员都讨厌它们,但我们只添加了一些:循环导入(这是两个模块相互依赖的时候。在这种情况下,views.py取决于
__init__.py
)。请注意,这一般是一个坏主意,但这里实际上很好。这样做的原因是我们实际上并没有使用__init__.py
中的视图,只是确保导入模块,我们在文件底部进行操作。
在import myapp.views
和__init__.py
定义后,确保app
位于db
的底部。它与pep8 guidelines相反,但正如上面所说,这里实际上很好。