带有蓝图的SQLAlchemy和Flask:引擎/ sessionmaker生存期

时间:2018-11-23 09:13:41

标签: flask sqlalchemy

在过去的几个月中,我编写了六个小烧瓶/ sqlalchemy应用程序,看来我会继续前进。它们主要是独立的Intranet工具,可提供各种公司数据库中数据的视图和评估。我有一个基本上带有公司徽标,样式表和一些常用视图(登录/注销)的蓝图。因此,典型的应用程序遵循以下样板模式:

if (production_environment):
    engine_1 = create_engine(uri_1)
    engine_2 = create_engine(uri_2)
    engine_3 = create_engine(uri_3)
else: # offline the intranet
    engine_1 = create_engine(devel_server)
    # etc.

Session_1 = sessionmaker(...)
Session_2 = sessionmaker(...)
Session_3 = sessionmaker(...)

app = Flask("some_app")
app.register_blueprint(company_layout)
# this is needed for the company blueprint template to display the
# title of the app in the top title bar
app.config['TITLE'] = "Some App"

@app.route('/')
def index():
    db1 = Session_1
    db2 = Session_2
    ... you get the gist.

现在有很多样板代码。最初,我想将所有这些配置和数据库设置因素分解为带有sessionmakers的单独模块,以及一个将返回完全设置的应用程序的功能。但这仍然给我留下了很多单独的应用程序,所有这些应用程序都需要在webserver / wsgi级别上拥有自己的入口点,而且它们也无法在开发服务器中相互链接。

从flask文档中,我了解到处理这种情况的方法是将所有小应用程序分解为单独的蓝图,然后创建一个集中配置的主应用程序并在其上注册所有蓝图。我已经尝试过了,它可以按预期工作。但是有些事情我要么无法弄清楚,要么似乎已经以一种奇怪的方式想通了,“这不是工作的本意”。

第一:我希望蓝图设置其自己的标题以显示在顶部布局模板中。现在,我正在使用config ['TITLE'] hack来做到这一点。这就是上下文处理器的用途吗?

第二个:数据库。 sqlalchemy文档说,应该在应用程序/请求上下文外部设置一次引擎和sessionmaker,并在每个请求级别(我现在这样做的方式)上创建/关闭会话。这似乎与Flask文档相反,Flask文档建议在应用程序的配置中设置数据库URI(优雅地解决了生产/开发方面的区别)。但是,这意味着整个数据库基础架构都需要针对每个请求进行设置和拆除,因为一切都在应用程序上下文中发生。然后,我需要以某种方式在主应用程序模块中创建所有引擎和会话创建者,以某种方式将其传递给蓝图,并让蓝图进行所需的会话。我怎么做?以某种方式使用“ g”对象?这样会不会产生不必要的开销?

无论如何,正如您所看到的,我在网站的体系结构方面有些困惑,并且非常感谢您的建议。谢谢。

PS:我已经在pooco,org上阅读过the app factory文档,但对它的意义不足以决定它是否对我的问题有所帮助。我没有使用Flask-SQLAlchemy,因为我不能告诉它有什么好处。几乎所有文档都重复了SQLAlchemy的数据库模型设计内容,但没有说明使用Flask-SQLAlchemy替代具有scoped_session的普通SQLAlchemy的任何好处。似乎在做的是使许多基本的SQLalchemy机制以我不了解的方式隐形。

0 个答案:

没有答案