我正在尝试显示带有表单的页面,然后在提交表单时向数据库添加Player
。但是,我无法查看表单,因为浏览器始终显示400 Bad Request
错误。其他帖子表明这可能是因为表单输入的名称与我从request.form
获得的密钥不匹配,但我的所有密钥都匹配。为什么我会收到此错误?
<form method="post">
{{ form.hidden_tag() }}
<input name="name">
<input name="available">
<input type="submit">
</form>
@app.route('/addplayer', methods=['GET', 'POST'])
def addplayer():
connect('basketball_contracts', host='localhost', port=27017)
n = request.form['name']
a = request.form['available']
post= Post(
name=n,
available=a
)
post.tags = ['test']
post.save()
return render_template('addplayer.html', form=form)
答案 0 :(得分:4)
您的观点接受GET
和POST
次请求。 request.form
仅填写POST
。如果您尝试访问不存在的密钥,则会引发400错误。最初GET
页面时,不存在任何密钥。
这种常见模式是保护request.form
块中需要if request.method == 'POST'
的代码。在处理POST
请求后返回重定向,否则返回呈现的模板。
from flask import url_for, redirect, render_template
@app.route('/addplayer', methods=['GET', 'POST'])
def addplayer():
if request.method == 'POST':
Post(
name=request.form['name'],
available=request.form['available']
).save()
return redirect(url_for('index'))
return render_template('addplayer.html')
由于您似乎使用的是Flask-WTF,因此您可以使用表单的validate_on_submit
方法,而不是检查method
。在这种情况下,您还可以通过表单实例访问数据,并使用表单为您呈现输入。
from flask import url_for, redirect, render_template
@app.route('/addplayer', methods=['GET', 'POST'])
def addplayer():
form = AddPlayerForm()
if form.validate_on_submit():
Post(
name=form.name.data,
available=form.available.data
).save()
return redirect(url_for('index'))
return render_template('addplayer.html', form=form)
<form method=post>
{{ form.hidden_tag() }}
{{ form.name.label}} {{ form.name }}<br>
{{ form.available.label }} {{ form.available }}<br>
<input type=submit value="Add Player">
</form>