如何删除Flask蓝图与应用程序初始化之间的循环依赖关系?

时间:2015-07-09 07:50:40

标签: python python-3.x flask

我有一个简单的Flask demo app(Python 3),其中包含一些顶级应用初始化代码,以及一个只设置/取消设置一些布尔标志的蓝图。结构如下所示:

flaskery
├── config.py
├── flaskery
│   ├── app.py           - application init code (create app, db)
│   ├── __init__.py      - empty
│   ├── __main__.py      - entry point
│   └── switches
│       ├── state.py     - db structure
│       ├── switches.py  - control code
│       └── templates
│           └── (template stuff)
└── setup.py

app.py文件包含应用程序初始化代码,包括:

app = Flask(__name__)

# Note: Alchy has the same interface as flask.ext.sqlalchemy.SQLAlchemy,
# except that the model is less coupled to flask.
db = Alchy(app, Model=SwitchesState)

# Circular dependency!
from flaskery.switches.switches import switches_app

app.register_blueprint(switches_app)

db.create_all()

但是,蓝图代码包含:

from flaskery.app import db

...这样它可以做一些事情,例如。

switches_app = Blueprint('switches', __name__, url_prefix='', template_folder='templates')

@switches_app.route("/")
def root():
    # SwitchesState is your run-of-the-mill SQL schema defined as
    # a class.
    state = SwitchesState()

    # Do things that include, say...
    db.session.add(state)
    db.session.commit()

    # etc.

    template = render_template(...)
    return template

我不喜欢这种循环依赖。我更喜欢蓝图只需要知道操作数据库会话所需的接口(如果有的话),而不需要从顶层导入已经初始化的对象。使顶级应用程序代码不依赖于导入顺序是另一个目标。我还想避免依赖于全局控制代码(尽管Flask的“会话”和“请求”全局变量都是一种天蝎座,但是这种情况会更好)。

有没有办法打破这种循环依赖,仍然使用Flask?

0 个答案:

没有答案