Flask_Sqlalchemy与多线程Apache。会话与数据库不同步

时间:2018-07-19 18:39:35

标签: multithreading apache flask sqlalchemy

背景: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个中的一个会失败,而且也不总是“ last”值,无论测试如何,它似乎都会“卡在”某个值很多次我改变它。

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

db = SQLAlchemy()

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

这将创建一个scoped_session,可在db.session中访问。

Apache配置很长很复杂,但其中包含

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

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

1 个答案:

答案 0 :(得分:0)

作为参考,如果有人发现具有相同问题的该线程,我已解决了问题。

我的Flask App工厂功能最初是基于Flask教程而剩下的行app.app_context().push()。不幸的是,从示例代码中删除了它,否则可能有人发现了它。在项目的重组过程中,这条线被排除在外,问题得以解决。不确定为什么或仅此行会导致此问题,仅针对部分但不是全部请求。