应用程序设置:使用默认会话
在事件小组WSGI中运行Flask在客户端,我使用jQuery从异步事件处理程序中向服务器发送POST请求:
function set_option(option, value) {
$.post('/api/options/' + option, {'value': value});
}
$('.option').change(function() {
var element_id = $(this).prop('id');
var value = $(this).val();
set_option(element_id, value);
});
在服务器端,我将选项及其值添加到Flask会话中:
from flask import Flask, request, session
app = Flask(__name__)
[...]
@app.route('/api/options/<option>', methods=['POST'])
def set_option(option=None):
if request.method == 'POST' and option is not None:
option_value = request.form.get('value')
if option_value is not None:
session[option] = option_value
上述客户端事件处理程序有时可以在给定时刻内多次调用。这似乎会导致使用Flask会话cookie的竞争条件。例如,如果事件处理程序从两个强制.change()调用在不同元素上被触发两次,则会话最终只会根据最后一个POST请求进行修改。
假设有两个元素被更改为以下值:
option_one='1234' and option_two='5678'
Flask会话已包含以下内容:
{'option_one': '0', 'option_two': '0'}
对于每个选项,分别向Flask服务器发送两个单独的请求。第一个请求将Flask会话设置为:
{'option_one': '1234', 'option_two': '0'}
第二个请求将Flask会话设置为:
{'option_one':'0', 'option_two': '5678'}
来自第二个请求的会话最终会从第一个请求中替换会话,从而消除了为option_one存储的所需值。
考虑到这一点,如果在每次调用之间调用事件处理程序的时间更长,会话cookie似乎会更新。
当请求在几百毫秒内相互作出时,Flask及其会话/ cookie管理的这种行为是否可以预期?
服务器端会话管理是一个解决方案吗?
答案 0 :(得分:0)
正如Martijn和大卫所指出的那样,会话行为是一种竞争条件,并且是可以预期的。
解决方案是将这些数据存储在服务器上,并确保妥善处理修改冲突。