【问题标题】:Flask file structure烧瓶文件结构
【发布时间】:2013-01-27 00:57:56
【问题描述】:

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

schema.py:

from myapp import db

views.py:

from myapp import app,db
import myapp.schema

__init__.py

import myapp.views

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

【问题讨论】:

标签: python flask


【解决方案1】:

哦,是的,我们也经常遇到循环导入,但解决它的一种方法是创建文档中的应用程序工厂。

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

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

【讨论】:

    【解决方案2】:

    在烧瓶中有一个叫做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(...)
    

    【讨论】:

      【解决方案3】:

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

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

      确保import myapp.views 位于__init__.py 的底部,在定义appdb 之后。它与pep8 guidelines 相违背,但正如上面的引文所说,这实际上很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2014-08-25
        • 2021-07-03
        • 1970-01-01
        相关资源
        最近更新 更多