Python 烧瓶会话不持久

Python 烧瓶会话不持久,python,ajax,session,flask,Python,Ajax,Session,Flask,我有一个web应用程序运行在Flask后端,由一个JS客户端处理前端工作。我试图通过一个简单的FlaskAPI将键值对保存到Flask的会话对象(Flask.session)时遇到问题 我试图修改的会话对象称为account\u id,两个API路由基本上如下所示: 获取 @access_service.route('/current_account.json', methods=['GET']) @login_required def show_current_account(): r

我有一个web应用程序运行在Flask后端,由一个JS客户端处理前端工作。我试图通过一个简单的FlaskAPI将键值对保存到Flask的会话对象(
Flask.session
)时遇到问题

我试图修改的会话对象称为
account\u id
,两个API路由基本上如下所示:

获取

@access_service.route('/current_account.json', methods=['GET'])
@login_required
def show_current_account():
    return jsonify(account_id=session.get('account_id'))
@access_service.route('/current_account.json', methods=['POST'])
@login_required
def update_current_account():
if request.json:
    session['account_id'] = request.json['account_id']
    return jsonify(account_id=session.get('account_id'))
return jsonify()
发布

@access_service.route('/current_account.json', methods=['GET'])
@login_required
def show_current_account():
    return jsonify(account_id=session.get('account_id'))
@access_service.route('/current_account.json', methods=['POST'])
@login_required
def update_current_account():
if request.json:
    session['account_id'] = request.json['account_id']
    return jsonify(account_id=session.get('account_id'))
return jsonify()
在JS前端,对POST路由的调用如下所示:

$.ajax({
  url: '/current_account.json',
  contentType: 'application/json',
  type: 'POST',
  data: JSON.stringify({ 'account_id': 10 })
});
ajax调用返回200OK和正确的返回值。从Flask应用程序的日志记录还显示会话现在包含值为10的key
account\u id
。但是,在发出POST请求后立即查找
/current\u account.json
,只会返回一个
account\u id
,其值为
null


更奇怪的是,使用一个简单的浏览器内REST客户端,对当前帐户.json发出相同的POST请求,会导致会话正常工作,并在整个页面刷新等过程中保持不变,这让我相信问题与请求本身有关,而不是与Flask的会话对象有关,尽管我似乎无法弄清楚到底是什么导致了它。

在我以前的项目中,我们遇到了同样的问题,结果是$.ajax不带cookies。我们使用手动会话存储来解决此问题。

您可以在会话中使用一些选项,这些选项可能有助于进一步调试。您可以在更新会话后立即尝试使用
session.modified
。尽管flask应该跟踪您所做的更改,但告诉会话它已显式更改可能会传播您的更改。如果是这样的话,那么这可能会让我们对正在发生的事情有一个更好的了解。此外,您可以尝试将
session.permanent\u session\u life
设置为
True
。这将确保会话在浏览器关闭期间存在。这可能有助于我们诊断它是否是头/javascript/请求问题。我添加了
会话的日志记录。在POST路由中更改会话后修改了
,它输出
True
。关于你的第二点,我假设你指的是
session.permanent
,它让我发现了一个问题。在这两种情况下,使用
$.ajax
和REST客户端退出会话。在POST/GET路由中返回永久的
False
。在POST路由中设置
session.permanent=True
,在使用
$的GET路由中,它已恢复为
False
。ajax
,但在使用REST客户端时仍保持
True
。不过最终的结果是一样的,使用REST客户端可以持久化会话,但$.ajax不能。不确定这是否有帮助,但您可能需要查看flask的ajax调用文档。您能否检查ajax请求是否携带与您的REST客户端调用相同的会话cookie?然而,这让我们认为这可能是浏览器的问题,因为来自XHR的cookie会被丢弃,而REST客户端的请求则不会。例如,见。我们对此有点困惑,所以如果有任何错误,请纠正我。在任何情况下,我们都将使用redis作为会话存储,这样我们就可以绕过这个问题。