Flask 视图显示 400 错误而不是带有表单的模板
Flask view shows 400 error instead of template with form
我正在尝试显示带有表单的页面,然后在提交表单时将 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)
您的视图接受 GET
和 POST
请求。 request.form
仅在 POST
填写。如果您尝试访问不存在的密钥,则会引发 400 错误。当您最初 GET
页面时,将不存在键。
常见的模式是在 if request.method == 'POST'
块中保护需要 request.form
的代码。 Return 处理 POST
请求后的重定向,否则 return 呈现的模板。
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>
我正在尝试显示带有表单的页面,然后在提交表单时将 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)
您的视图接受 GET
和 POST
请求。 request.form
仅在 POST
填写。如果您尝试访问不存在的密钥,则会引发 400 错误。当您最初 GET
页面时,将不存在键。
常见的模式是在 if request.method == 'POST'
块中保护需要 request.form
的代码。 Return 处理 POST
请求后的重定向,否则 return 呈现的模板。
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>