2016-04-30 4 views
0

Я пытаюсь вернуть данные из HTML-формы с запросом POST с использованием Flask. По какой-то причине я получаю ошибку 400 Bad Request. Посмотрев на Chrome Dev Tools, я вижу, что все поля формы с тегом ввода являются частью почтового запроса. Тег select с раскрывающимся списком не записывается, и я думаю, что это создает ошибку. Кто-нибудь знает, почему тег select не записывается в почтовом запросе? Любая помощь очень ценится.400 Ошибка запроса на запрос POST с Flask

Вот 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 INFO: Так что, если я удалю эту линию, плохой запрос ошибка уходит:

print request.form['vendor'] 

Это потому, что поле «vendor» является единственным в html-форме, в котором используется тег select для ввода, и эти данные не попадают в словарь post request (который я вижу в Chrome Dev Tool). В запросе POST отсутствует поле, связанное с тегом select. Не знаете, как захватить тэг select в форме данных ...

ответ

-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() }}"/> 

надеюсь, что это поможет !! не стесняйтесь редактировать.