2017-05-28 85 views
0

我有一個Flask應用程序,它將一些值存儲在數據庫中。這些來自HTML表單。其中有些是添加到瓶的會話,使用下面的代碼:從Flask會話中檢索值時發生KeyError

session['userID']=str(cur_var.getvalue())

我有一個調試HTML頁面只顯示無論是存儲在當前會話。渲染這個頁面的代碼如下:

@app.route('/debug/') 
def debug(): 
    return str(session) 

一旦我打開這個頁面,

<securecookiesession {'usercoord': 7.0,'userid': '53.0'}></securecookiesession> 

對於我明白了,我會肯定有一個userid關鍵。

然而,當我的瓶的應用是在試圖檢索當前會話的用戶ID的另一個(未着色)網址: new_address.append(float(session['userid']))

我收到以下錯誤:

<title>KeyError: 'userid' // Werkzeug Debugger</title> 

此外,我做了一個非常簡單的網頁,應該只打印session['userID']。我用下面的代碼在我的瓶的應用:

@app.route('/print/') 
def printing(): 
    return render_template('print.html', printing=session['userid']) 

這是print.html模板:

{% extends "layout.html" %} 
{% block content %} 
{{ printing }} 
{% endblock %} 

我們得到以下錯誤:

builtins.KeyError 
KeyError: 'userid' 

我已經嘗試過這同樣的邏輯在一個小得多的應用程序,它工作得很好。我的錯誤在哪裏可以在這裏?

非常感謝您提供的任何幫助。

P.S. 如果它有任何用處,我正在使用jQuery處理網頁和我的Flask應用程序之間的交互,並使用AJAX發佈數據。

UPDATE

改造項目將其降低到一個更簡單的一個後,我發現,有時(是有原因的,我不明白),增加一個新的值到燒瓶會議將無法正常工作。舉例來說,如果我有這行代碼:

session['coordid']=float(cur_var.getvalue())

在我print.html頁檢查str(session)的價值,我沒有看到關鍵coordid

回答

0

問題與AJAX如何異步有關。如果你調用兩個不同的jQuery函數,每個函數都帶有AJAX調用,那麼很可能會有人請求未經處理的數據。

在這種情況下,你有一個函數可以產生一個AJAX調用,這是Python捕獲的。 Python應用程序從調用中獲取數據並將其存儲到數據庫中。與此同時,還有另外一個Python需要處理的AJAX調用。但是,由於並非所有信息在第一次通話中都已完成處理,因此您將獲得KeyError

我試過幾件事情來解決這個問題:

  • 使用回調;然而,正如Lazaris(2012)在他的文章Callback Functions in JavaScript中指出的那樣,「如果函數包含某種異步執行(如Ajax調用或動畫),則該回調將在異步操作開始後執行,但可能會在完成之前執行。 「

  • 在AJAX成功回調中調用第二個函數,但這不起作用。

  • 最後,解決方案是在Python應用程序中添加以下代碼。執行該依賴的值被添加到會話功能之前,檢查此值存在:

    count = 1000 while not session['coordid'] and count: count -= 1