使用Flask对POST请求发出400错误请求错误

时间:2016-04-30 16:24:30

标签: python forms flask bad-request

我正在尝试使用Flask通过POST请求从HTML表单返回数据。出于某种原因,我收到了400 Bad Request错误。看看Chrome Dev Tools,我可以看到带有输入标记的所有表单字段都是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>

这是Flask python路线:

@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表单中唯一一个使用select标签进行输入的字段,并且该数据未在post请求字典中显示(我可以在Chrome Dev Tool中看到)。 POST请求缺少与select标记关联的字段。不确定如何捕获表单数据中的select标记...

3 个答案:

答案 0 :(得分:2)

我在处理烧瓶形式时已经多次面对这个问题,我认为解决方案是启用csrf令牌保护: 根据{{​​3}},您需要为您的应用初始化并启用它! 大多数时间错误400是由于缺少CSRF令牌。 你可以这样做:

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)

用于初始化 并以您的形式添加:

<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
希望它会有所帮助!! 随时编辑。

答案 1 :(得分:1)

形式= “addInvoice”

此属性作为HTML表单标记的一部分是导致错误的原因。我不确定为什么,但当它被删除时,错误消失了。

(感谢您在上面的帮助,试图调查此内容。)

答案 2 :(得分:-2)

您需要getlist来捕获select