2

我正在开发一个中等大小的烧瓶应用程序。我有两个主要模块,一个用于创建数据库以免将其称为 schema.py,另一个用于提供视图 views.py。我在http://flask.pocoo.org/docs/patterns/packages/app中使用建议的结构, 我db=SQLAlchemy(app)__init__.py. 我在这里解决循环导入问题!以下是我的文件导入:

schema.py:

from myapp import db

views.py:

from myapp import app,db
import myapp.schema

__init__.py

import myapp.views

因此,当我运行 schema.py 时,我会收到循环导入错误。我应该如何解决这个问题?我将不胜感激任何建议。

4

3 回答 3

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

如果需要,您可以将组件放在另一个模块中以使它们更加分离,但这是我们发现的“帮助”防止循环导入的最简单方法。

于 2013-02-13T21:29:35.997 回答
1

在烧瓶中,有一个对象叫做g,也有一个东西叫做current_appcurrent_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(...)
于 2013-01-27T06:58:57.840 回答
1

来自http://flask.pocoo.org/docs/patterns/packages/:(添加突出显示)

每个 Python 程序员都讨厌它们,但我们只是添加了一些:循环导入(这是两个模块相互依赖的时候。在这种情况下,views.py 依赖于__init__.py)。请注意,这通常是一个坏主意,但在这里它实际上很好。这样做的原因是我们实际上并没有使用其中的视图,__init__.py而只是确保导入了模块,而我们在文件的底部这样做。

确保它import myapp.views位于__init__.py、 afterapp和的底部db。它违反了pep8 指导方针,但正如上面的引述所说,这实际上很好。

于 2013-01-28T19:56:31.117 回答