【发布时间】: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