Flask视图显示400错误而不是带有表单的模板

时间:2017-09-18 13:29:19

标签: python flask wtforms flask-wtforms

我正在尝试显示带有表单的页面,然后在提交表单时向数据库添加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)

1 个答案:

答案 0 :(得分:4)

您的观点接受GETPOST次请求。 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>