我有一個Web應用程序在JS客戶端上運行在一個Flask後端,處理前端工作。我遇到了一些問題,試圖通過一個簡單的Flask API將鍵值對保存到Flask的會話對象(flask.session
)中。瓶頸會話不會持續
我試圖修改會話對象稱爲account_id
和兩個API路線基本上是這樣的:
GET
@access_service.route('/current_account.json', methods=['GET'])
@login_required
def show_current_account():
return jsonify(account_id=session.get('account_id'))
POST
@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調用返回200 OK和正確的返回值。從Flask應用程序記錄還顯示會話現在包含鍵值爲account_id
的值爲10.但是,在POST請求完成後立即查找/current_account.json
只需返回值爲account_id
的值爲null
。
更奇怪的是,使用一個簡單的瀏覽器中的REST客戶端並且向current_account.json
發出相同的POST請求會導致會話工作並按照預期通過整頁刷新等持續存在。因此,它會導致我相信這個問題與請求本身有關,而不是與Flask的會話對象有關,儘管我似乎無法弄清楚究竟是什麼導致了它。
有一些選項可用於會話,可能有助於調試更多。更新會話後,您可以嘗試使用'session.modified'。雖然燒瓶應該跟蹤你的改變,告訴會話它明確改變了可能會傳播你的改變。如果確實如此,那麼這可能會讓我們更好地瞭解發生的事情。另外,你可以嘗試設置'session.permanent_session_lifetime'等於'True'。這將確保會話貫穿於瀏覽器關閉。這可能有助於我們診斷它是否爲頭文件/ javascript /請求問題。 – aezell
在POST路由中更改會話後,我添加了'session.modified'的日誌記錄,輸出'True'。關於你的第二點,我假定你指的是'session.permanent',這導致我發現了一個。 在兩種情況下,使用'$ .ajax'和REST客戶端在POST/GET路由中註銷'session.permanent'返回'False'。 在POST路由中設置'session.permanent = True',它在GET路由中使用'$ .ajax'恢復爲'False',但使用REST客戶端保持爲'True'。 儘管最終結果相同,但使用REST客戶端會持續會話,但$ .ajax不會。 – Limescale
不知道這是否有幫助,但你可能想看燒瓶的ajax調用文檔。 http://flask.pocoo.org/docs/patterns/jquery/ – codegeek