Python 烧瓶会话不持久
我有一个web应用程序运行在Flask后端,由一个JS客户端处理前端工作。我试图通过一个简单的FlaskAPI将键值对保存到Flask的会话对象(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
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的keyaccount\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作为会话存储,这样我们就可以绕过这个问题。