在Flask应用程序中提交表单时,请求错误的原因是什么?

在阅读了许多类似的声音问题和相关的Flask文档之后,我似乎无法弄清楚在提交表单时会产生以下错误:

400错误的请求

浏览器(或代理)发送一个请求,这个服务器无法理解。

虽然表单总是正确显示,但是当我提交与以下任一函数关联的HTML表单时,会发生错误的请求:

@app.route('/app/business', methods=['GET', 'POST']) def apply_business(): if request.method == 'POST': new_account = Business(name=request.form['name_field'], email=request.form['email_field'], account_type="business", q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], account_status="pending", time=datetime.datetime.utcnow()) db.session.add(new_account) db.session.commit() session['name'] = request.form['name_field'] return redirect(url_for('success')) return render_template('application.html', accounttype="business") @app.route('/app/student', methods=['GET', 'POST']) def apply_student(): if request.method == 'POST': new_account = Student(name=request.form['name_field'], email=request.form['email_field'], account_type="student", q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], q8=request.form['q8_field'], q9=request.form['q9_field'], q10=request.form['q10_field'], account_status="pending", time=datetime.datetime.utcnow()) db.session.add(new_account) db.session.commit() session['name'] = request.form['name_field'] return redirect(url_for('success')) return render_template('application.html', accounttype="student") 

HTML的相关部分是

 <html> <head> <title>apply</title> </head> <body> {% if accounttype=="business" %} <form action="{{ url_for('apply_business') }}" method=post class="application_form"> {% elif accounttype=="student" %} <form action="{{ url_for('apply_student') }}" method=post class="application_form"> {% endif %} <p>Full Name:</p> <input name="name_field" placeholder="First and Last"> <p>Email Address:</p> <input name="email_field" placeholder="your@email.com"> ... 

大多数人的问题不是调用GETPOST ,而是我在这两个函数中都做了这个,而且我再次检查以确保我导入了所有必要的东西,例如from flask import request 。 我也查询了数据库,并确认没有添加表单中的内容。

在Flask应用程序中,我请求的表单字段在HTML表单中被标记为略有不同。 保持名称一致是必须的。 更多的可以在这个问题阅读表格发送错误,烧瓶

解决scheme很简单,并在评论中发现。 正如在这个问题所述, 表格发送错误,烧瓶 ,并由肖恩·维埃拉指出,

…问题是Flask在args和表单字典中找不到键时会引发HTTP错误。 Flask默认使用的是,如果你要求一个特定的密钥而不存在,那么请求中就会有一些东西被遗漏,而且整个请求都是无效的。

换句话说,如果只有一个你用Python请求的表单元素不能在HTML中find,那么POST请求是无效的,并且出现错误,在我的情况下没有任何回溯中的不规则性。 对我而言,这与拼写不一致:在HTML中,我标记了各种表单input

 <input name="question1_field" placeholder="question one"> 

而在Python中,当有一个POST被调用的时候,我抓住一个不存在的表单

 request.form['question1'] 

而为了与我的HTML表单名称保持一致,它必须是

 request.form['question1_field'] 

我希望这有帮助。