400 Ошибка неверного запроса при запросе POST с помощью Flask

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

Вот 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>

Вот маршрут питона Flask:

@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"

ДОБАВЛЕНА ИНФОРМАЦИЯ: Итак, если я удалю эту строку, ошибка неверного запроса исчезнет:

print request.form['vendor']

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


person user3308477    schedule 30.04.2016    source источник


Ответы (3)


Я много раз сталкивался с этой проблемой при работе с формой фляги, я думаю, что решение состоит в том, чтобы включить защиту токена csrf: согласно это вам нужно инициализировать и включить для вашего приложения! В большинстве случаев ошибка 400 возникает из-за отсутствия токена CSRF. вы можете сделать это как:

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)

для инициализации и в вашей форме добавьте:

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

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

person Espoir Murhabazi    schedule 13.07.2017
comment
Извиняюсь, в волнении забыл. - person Jason Strimpel; 06.03.2019

форма = "добавить счет"

Этот атрибут как часть разметки HTML-формы и вызвал ошибку. Я точно не знаю, почему, но когда его удаляют, ошибка исчезает.

(Спасибо за вашу помощь выше в попытке разобраться в этом.)

person user3308477    schedule 30.04.2016
comment
form="addInvoice" заставляет поле отправляться с формой addInvoice. В данном случае его не существует, но по этой причине поле не было отправлено. - person iurisilvio; 01.05.2016

Вам понадобится getlist, чтобы получить select.

person user6269244    schedule 30.04.2016