2012-10-16 113 views
2

我有一個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的會話對象有關,儘管我似乎無法弄清楚究竟是什麼導致了它。

+1

有一些選項可用於會話,可能有助於調試更多。更新會話後,您可以嘗試使用'session.modified'。雖然燒瓶應該跟蹤你的改變,告訴會話它明確改變了可能會傳播你的改變。如果確實如此,那麼這可能會讓我們更好地瞭解發生的事情。另外,你可以嘗試設置'session.permanent_session_lifetime'等於'True'。這將確保會話貫穿於瀏覽器關閉。這可能有助於我們診斷它是否爲頭文件/ javascript /請求問題。 – aezell

+0

在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

+0

不知道這是否有幫助,但你可能想看燒瓶的ajax調用文檔。 http://flask.pocoo.org/docs/patterns/jquery/ – codegeek

回答

2

在我以前的項目中,我們遇到了同樣的問題,事實證明$ .ajax不帶有cookie。我們使用手動會話存儲來解決問題。