2016-04-30 150 views
0

我試圖用POST請求使用Flask從HTML表單返回數據。出於某種原因,我收到了400錯誤請求錯誤。看看Chrome Dev Tools,我可以看到所有帶有輸入標籤的表單字段都是發佈請求的一部分。下拉列表中的select標籤沒有被捕獲,我認爲這是創建錯誤。任何人都知道爲什麼選擇標籤沒有在發佈請求中被捕獲?任何幫助非常感謝。使用Flask POST請求出現錯誤請求錯誤

下面是HTML表單:

 <label for="vendor">Select Vendor</label> 
     <div class="flextable p-b" style="padd"> 
      <div class="flextable-item">  
      <select class="selectpicker" data-live-search="true" form="addInvoice" name="vendor" id="vendor"> 
       <option>Jack Jaffa & Associates</option> 
       <option>Jacobs/Doland/Beer LLC</option> 
       <option>Jenkins & Huntington Inc.</option> 
       <option>Joseph J. Blake & Associates, Inc.</option> 
       <option>Langan (Geotechnical)</option> 
       <option>Madison Realty Capital</option> 
       <option>McNamara Salvia, Inc</option> 
       <option>Metropolis Group, Inc</option> 
       <option>National Grid</option> 
      </select> 
      </div> 
      <div class="flextable-item"> 
       <button type="button" class="btn btn-xs btn-primary-outline">Add vendor</button> 
      </div> 


     <label for="invoice_number">Invoice Number:</label> 
     <input type="text" class="form-control p-b" placeholder="Every vendor invoice # must be unique" name="invoice_number" id="invoice_number"> 

     <label for="invoice_amount">Amount:</label> 
     <input type="text" class="form-control p-b" placeholder="$0.00" name="invoice_amount" id="invoice_amount"> 

     <label for="invoice_amount">Description:</label> 
     <input type="text" class="form-control p-b" placeholder="$0.00" width="100%" name="description" id="description"> 

     <div class="spacer"></div> 



     <div class="flextable"> 
     <div class="flextable-item"> 
      <label for="date_received">Date received:</label> 
     </div> 
     <div> 
      <div class="flextable-item"> 
      <div class="input-group"> 
      <span class="input-group-addon"> 
       <span class="icon icon-calendar"></span> 
      </span> 
      <input type="text" value="01/01/2015" class="form-control" data-provide="datepicker" style="width: 200px;" name="date_received" id="date_received"> 
      </div> 
      </div> 
       </div> 
       </div> 
     </div> 


     <div class="modal-actions p-t-lg"> 
      <button type="button" class="btn-link modal-action" data-dismiss="modal">Cancel</button> 
      <button type="submit" class="btn-link modal-action" id="submit" > 
      <strong>Save + Continue</strong> 
      </button> 
     </div> 
    </form> 

這裏是瓶蟒蛇路線:

@app.route('/add_invoice', methods=['GET', 'POST']) 
def add_invoice(): 
""" Method for capturing form data to add invoice items to database""" 

if request.method == 'POST': 
    find_cost_code = 7777 # eventually need code to lookup cost-code from POST request 
    print request.form['invoice_number'] 
    print request.form['invoice_amount'] 
    print request.form['description'] 
    print request.form['vendor'] 
    print request.form['date_received'] 


return "This is a test" 

ADDED信息: 所以,如果我刪除此行,壞請求錯誤消失:

print request.form['vendor'] 

這是因爲「供應商」字段是html表單中唯一一個使用select標籤進行輸入的HTML表單,並且該數據未在post請求字典(我可以在Chrome Dev Tool中看到)捕獲。 POST請求缺少與選擇標記關聯的字段。不知道如何捕獲表格數據中的選擇標籤...

回答

-2

您需要getlist來捕獲select

+0

不,你只需要那個多值字段,而這個選擇不是。此外,這不會影響400錯誤。 – davidism

1

形式=「addInvoice」

此屬性爲我的HTML表單標記的部分是什麼原因造成的錯誤。我不確定到底是什麼原因,但是當它被刪除時,錯誤消失了。

(。感謝您的幫助上面試圖尋找到這一點)

+1

'form =「addInvoice」'使該字段以'addInvoice'形式發送。在這種情況下,它不存在,但這是該字段未被髮送的原因。 – iurisilvio

0

與瓶的形式打交道時,我遇到過這個問題很多的時候,我認爲解決的辦法是讓CSRF令牌保護: 根據this你需要初始化並啓用它爲你的應用程序! 大部分時間錯誤400都是由於丟失了CSRF令牌。 你可以做到這一點是:

from flask_wtf.csrf import CSRFProtect 

csrf = CSRFProtect(app) 

用於初始化 並在表單中添加:

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/> 

希望這將有助於! 隨時編輯。