真的很难接受这个来自烧瓶的坏请求。我通常知道它是由于烧瓶没有在表格中找到[键]而引起的。但是,我已经检查了我的表格和python代码40次,看不出任何理由。我已经注释掉每个引用request.form的python代码行。我已经做到了1比1,我仍然得到一个糟糕的要求。然而,当我评论所有的行时,坏的请求消失了......任何想法都会很棒......
Python代码;
if request.method == 'POST':
form = 'Add Package Form'
clientId = request.form['id']
date = request.form['date2']
strPrice = request.form['price']
price = float(strPrice)
adultlessons = request.form['adult']
juniorlessons = request.form['junior']
shortlessons = request.form['short']
playinglessons = request.form['playing']
notes = request.form['notes']
形式..
<form action="/addpackage" method="post" class="sky-form">
<fieldset>
<section>
<label class="label">Select Package Date</label>
<label class="input">
<i class="icon-append fa fa-calendar"></i>
<input type="text" name="date2" id="date">
</label>
</section>
<div style="margin: -25px"></div>
<fieldset>
<section>
<label class="label">Price</label>
<label class="input">
<input type="text" name="price">
</label>
</section>
<section>
<label class="label">Adult Lessons</label>
<label class="input">
<input type="text" name="adult">
</label>
</section>
<section>
<label class="label">Junior Lessons</label>
<label class="input">
<input type="text" name="junior">
</label>
</section>
<section>
<label class="label">Short Game Lessons</label>
<label class="input">
<input type="text" name="short">
</label>
</section>
<section>
<label class="label">Playing Lessons</label>
<label class="input">
<input type="text" name="playing">
</label>
</section>
<section>
<label class="label">Notes</label>
<label class="textarea textarea-expandable">
<textarea rows="3" name="notes"></textarea>
</label>
<div class="note"><strong>Note:</strong> expands on focus.</div>
</section>
</fieldset>
</fieldset>
<!-- hidden client id -->
<input type="hidden" name="id" value="{{ client.id }}">
<!-- /hidden client id -->
<footer>
<button type="submit" name="addpackage" value="package" class="button">Add Package</button>
</footer>
</form>
答案 0 :(得分:1)
这是一个半答案,但是评论太长了。
如果您在Flask应用程序中启用调试,您应该获得详细的回溯,指出问题发生的确切位置(在浏览器和控制台上)。
如果您的申请目前有类似的内容:
app.run()
只需将debug
参数设置为true
:
app.run(debug=True)
如果在启用调试后仍然不确定导致问题的原因,请更新您的问题以包含回溯。
对于它的价值,如果我将您的表单和代码转储到一个简单的Flask应用程序中,只要我为price
字段提供数值,它似乎都可以正常工作 EM>
答案 1 :(得分:1)
通常,当您尝试访问不存在的400 Bad Request
对象中的表单密钥时,在提交表单时,您会在Flask中获得request
。
这是因为request.form
对象在__getitem__
模块中继承了Multidict
类,werkzeug.datastructures
模块会引发BadRequestKeyError
when a key doesn't exist。
答案 2 :(得分:0)
您应该为表单数据提供一个默认值以避免HTTP 400错误,如下所示:
default_value = True
is_public = request.form.get('public', default_value)
但是,我建议您使用Flask-WTF 使用Flask-WTF,您的代码可以简化为此(示例):
import ...
app = Flask(__name__)
class EditProfileForm(Form):
name = StringField('name', validators=[Length(0, 64)])
location = StringField('city', validators=[Length(0,64)])
website = StringField('website', validators=[Length(0,64), render_kw={"placeholder": "http://..."})
about_me = TextAreaField('Bio', validators=[Length(0,2000)], render_kw={"placeholder": "I'm......"})
submit = SubmitField(u'submit')
@app.route('/edit-profile', methods=['GET', 'POST'])
def edit_profile():
form = EditProfileForm()
if form.validate_on_submit():
current_user.name = form.name.data
current_user.location = form.location.data
current_user.website = form.website.data
current_user.about_me = form.about_me.data
db.session.add(current_user)
flash('Update success!', 'success')
return redirect(url_for('.user', username=current_user.username))
return render_template('edit_profile.html', form=form)
在你的html文件中:
<form method="POST" action="/">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name() }}
{{ form.location.label }} {{ form.location() }}
...
</form>
顺便说一下,如果你使用Flask-Bootstrap,你可以使用一行来渲染整个表格:
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
我希望它会有所帮助。