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

Posted

技术标签:

【中文标题】Flask 视图显示 400 错误而不是带有表单的模板【英文标题】:Flask view shows 400 error instead of template with form 【发布时间】:2018-02-27 01:34:14 【问题描述】:

我正在尝试显示带有表单的页面,然后在提交表单时将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】:

您的视图接受GETPOST 请求。 request.form 仅在 POST 上填写。如果您尝试访问不存在的密钥,则会引发 400 错误。当您最初GET 页面时,将不存在任何键。

常见的模式是在if request.method == 'POST' 块中保护需要request.form 的代码。处理完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>

【讨论】:

以上是关于Flask 视图显示 400 错误而不是带有表单的模板的主要内容,如果未能解决你的问题,请参考以下文章

通过表单在 Flask 上发布数据给出 400 Bad Request

从 HTML 表单发布值并在 Flask 视图中访问它们

在 Android 上检索错误对象而不是 HTTP 400

如何在 Flask 中重新加载有错误的 fancybox iframe 表单

Python/Flask/HTML - 在新窗口而不是主页中呈现 HTML

如何在不导致400错误请求错误的情况下使用Python Flask“打开”复选框?