多个请求在Flask

时间:2018-01-22 18:11:12

标签: python asynchronous flask session-cookies

应用程序设置:使用默认会话

在事件小组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管理的这种行为是否可以预期?

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

1 个答案:

答案 0 :(得分:0)

正如Martijn和大卫所指出的那样,会话行为是一种竞争条件,并且是可以预期的。

解决方案是将这些数据存储在服务器上,并确保妥善处理修改冲突。