Flask文件结构

时间:2013-01-27 00:57:56

标签: python flask

我正在研究中型烧瓶应用。我有两个主要模块,一个用于创建数据库,另一个用于称为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时,我将收到循环导入错误。我该怎么解决这个问题?我很感激任何建议。

3 个答案:

答案 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相反,但正如上面所说,这里实际上很好。