【问题标题】:Flask_Sqlalchemy with multithreaded Apache. Sessions out of sync with database带有多线程 Apache 的 Flask_Sqlalchemy。会话与数据库不同步
【发布时间】:2018-07-19 18:39:35
【问题描述】:

背景:Apache 服务器使用 mod_wsgi 为使用 Flask_Sqlalchemy 连接到 MySQL 的 Flask 应用程序提供服务。这是一个完整的堆栈应用程序,因此几乎不可能创建一个最小的示例,但我已经尝试过了。

我的问题是,当我进行一些应该修改数据库的更改时,后续请求似乎并不总是反映该更改。例如,如果我创建一个对象,然后尝试编辑同一个对象,编辑有时会失败。

大多数情况下,如果我创建一个对象然后转到列出所有对象的页面,它不会显示在列表中。有时它会显示,直到我刷新,然后它会消失,然后再次刷新它会再次出现。

编辑也是如此。示例代码:

bp = Blueprint('api_region', __name__, url_prefix='/app/region')
@bp.route('/rename/<int:region_id>/<string:name>', methods=['POST'])
def change_name(region_id, name):
    region = Region.query.get(region_id)
    try:
        region.name = name
    except AttributeError:
        abort(404)
    db.session.add(region)
    db.session.commit()
    return "Success"


@bp.route('/name/<int:region_id>/', methods=['GET'])
def get_name(region_id):
    region = Region.query.get(region_id)
    try:
        name = region.name
    except AttributeError:
        abort(404)

    return name

创建对象后发送 POST

curl -X POST https://example.com/app/region/rename/5/Europe

然后是几个 GET

curl -X GET https://example.com/app/region/name/5/

有时,GET 会返回正确的信息,但有时它会返回之前的任何信息。进一步的示例输出https://pastebin.com/s8mqRHSR 它以不同的频率发生,但大约有 25 分之一会失败,而且它也不总是“最后一个”值,在测试时,无论多少次,它似乎都“卡在”某个值我改一下。

我正在使用 Flask_Sqlalchemy 的“动态绑定”示例

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
    ... snip ...
    return app

这会创建一个可在 db.session 中访问的 scoped_session

Apache 配置冗长而复杂,但包含一行

WSGIDaemonProcess pixel processes=5 threads=5 display-name='%{GROUP}'

如果需要,我可以发布更多信息。

【问题讨论】:

    标签: multithreading apache flask sqlalchemy


    【解决方案1】:

    如果有人发现这个帖子有同样的问题,作为参考,我解决了我的问题。

    我的 Flask App 工厂函数在早期基于 Flask 教程时有 app.app_context().push() 行。不幸的是,示例代码被剪掉了,否则它可能会被某人发现。在项目的重组期间,这条线被遗漏了,问题自行解决了。不确定这条线为什么或如何导致此问题,并且仅适用于某些但不是所有请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2017-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多