2013-07-19 75 views
11

我已經查看了文檔,但對於我的生活,我無法弄清楚Flask中的request.form對象是如何填充的。 The documentation表示它充滿了來自POST或PUT請求的解析表單數據,但是我的表單是動態的,因此我不一定知道發送POST請求時存在哪些字段 - 儘管我想確保從這些字段中添加信息到數據庫。flask.request.form中的動態表單字段

表單中的某些字段總是存在,但是也會有大約60個列表中的任何數量的額外字段。我應該如何確定請求中的哪些附加字段以及如何解決我應該從他們那裏得到數據嗎?

編輯:我的具體問題已經解決,但它仍然值得問如何填充request.form字典。我發現如果複選框的輸入沒有被選中,那麼就不會有任何關鍵字添加到它的名字下的字典中,並且試圖從字典中得到一個不存在的關鍵字的值會導致一個相當混亂和模糊的結果HTTP 400 BAD REQUEST錯誤。

+0

request.form中顯示的值取決於瀏覽器發送的數據。不選擇複選框時不發送密鑰的決定由瀏覽器完成,而不是由Flask完成。 –

+0

我認爲如果您爲新問題提出新問題,這是最好的。 –

回答

19

request.form返回一個MultiDict對象。基本上,這意味着對於1個鍵,您可以有多個值。如果你想測試你的表單POST的樣子,只是做一個快速的打印語句如果你讀了MultiDict文檔如下

f = request.form 
for key in f.keys(): 
    for value in f.getlist(key): 
     print key,":",value 

,它說

「A MultiDict是定製字典子處理對於其是例如在包裝中使用由解析功能的相同鍵的多個值。這是必要的,因爲某些HTML表單元素傳遞多個值爲相同的密鑰。

http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.MultiDict

+0

我想說(貢獻),乍看之下,理解'request.form'如何像正常的Python字典一樣被解析有點困難(儘管它返回了一種'dict' 'tuples'如果你嘗試打印'f'),但答案很有意義,特別是關於這個例子以及Flask MultiDict的定義。非常感謝,#codegeek :)。 – ivanleoncz