Flask中多个请求修改session时的行为

Behaviour when multiple requests modify the session in Flask

应用程序设置:Flask 运行 在 eventlet WSGI 中使用默认会话

在客户端,我使用 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 的这种行为及其 session/cookies 管理是在几百毫秒内发出请求时预期的吗?

服务器端会话管理会是一个解决方案吗?

正如 Martijn 和 davidism 所指出的,会话行为是一种竞争条件,是可以预料的。

解决方案是将此类数据存储在服务器上,并确保正确处理修改冲突。