我有一个简单的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?