背景: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}'
如果需要,我可以发布更多信息。
答案 0 :(得分:0)
作为参考,如果有人发现具有相同问题的该线程,我已解决了问题。
我的Flask App工厂功能最初是基于Flask教程而剩下的行app.app_context().push()
。不幸的是,从示例代码中删除了它,否则可能有人发现了它。在项目的重组过程中,这条线被排除在外,问题得以解决。不确定为什么或仅此行会导致此问题,仅针对部分但不是全部请求。