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)

您的视图接受 GETPOST 请求。 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>