首页 > 解决方案 > 还有一个关于 Flask 的应用程序上下文和 SQLAlchemy 的问题

问题描述

我不知道烧瓶,我已经使用它几年了。我有一个运行良好的应用程序:基于浏览器的 UI 显示分析管道的结果,方便地存储在数据库中。但是,随着越来越多的内容(部分)添加到应用程序中,需要进行全面重构。

基于几个可用的指南和教程,该应用程序现在广泛使用了烧瓶的蓝图和分组逻辑。像这样的东西:

/analysis_pipeline
|-- /controller
│   |-- __init__.py
│   |-- api.py
│   |-- /home
│   │   |-- /templates
│   │   |-- /static
│   │   |-- home.py
│   ├── /results
│   │   |--/templates
│   │   |--/static
│   │   |--results.py
...
|-- /pipeline
|   |-- __init__.py
|   |-- /Condition_A
|   |   |-- __init__.py
|   |   |-- condition_a.py
|   |   |-- utils.py
|   |-- /Condition_B
|   |   |-- __init__.py
|   |   |-- condition_b.py
|   |   |-- utils.py
|   |-- pipeline_manager.py
...
|-- factory.py
|-- application_entry_point.py

应用程序正确启动,但在执行分析管道期间出现问题。

pipeline_manager.py_get_current_object()通过函数获取应用对象。然后准备执行并触发它。

应用程序必须对数据库运行一些 R/W 操作,我执行从内部推送 app_context 操作condition_a.py。为了做到这一点,我从烧瓶中导入current_app代理并使用它,正如在with声明中解释的那样。

from flask import current_app as app

...

with app.app_context():
    a_query = text("update a_table set name = 'NAME' where value = 123;")
    db.engine.execute(a_query)

但是,不会推送上下文,也无法进行 R/W 操作,除非整个管道在with语句下运行。这可能很好,即使我觉得这不是正确的使用方式。

with current_app.app_context():
    pipeline.run()

此外,这样我有时会遇到mysql的Lock wait timeout exception,这是以前从未发生过的。

我怀疑我仍然滥用(或误解)应用程序代理,并且无法弄清楚错误在哪里。任何人都可以帮助我(或指出一些可以帮助我的资源)找到正确的使用方法吗?

标签: pythonflaskflask-sqlalchemy

解决方案


推荐阅读