使用Flask POST请求出现错误请求错误
我试图用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请求缺少与选择标记关联的字段。不知道如何捕获表格数据中的选择标签...
形式=“addInvoice”
此属性为我的HTML表单标记的部分是什么原因造成的错误。我不确定到底是什么原因,但是当它被删除时,错误消失了。
(。感谢您的帮助上面试图寻找到这一点)
'form =“addInvoice”'使该字段以'addInvoice'形式发送。在这种情况下,它不存在,但这是该字段未被发送的原因。 – iurisilvio
与瓶的形式打交道时,我遇到过这个问题很多的时候,我认为解决的办法是让CSRF令牌保护: 根据this你需要初始化并启用它为你的应用程序! 大部分时间错误400都是由于丢失了CSRF令牌。 你可以做到这一点是:
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
用于初始化 并在表单中添加:
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
希望这将有助于! 随时编辑。
不,你只需要那个多值字段,而这个选择不是。此外,这不会影响400错误。 – davidism