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 所指出的,会话行为是一种竞争条件,是可以预料的。
解决方案是将此类数据存储在服务器上,并确保正确处理修改冲突。
应用程序设置: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 所指出的,会话行为是一种竞争条件,是可以预料的。
解决方案是将此类数据存储在服务器上,并确保正确处理修改冲突。