小编典典

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

python

我正在尝试显示一个带有表单的页面,然后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)

阅读 142

收藏
2020-12-20

共1个答案

小编典典

您的视图接受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方法而不是使用check
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>
2020-12-20