【问题标题】:Form sending error, Flask表单发送错误,Flask
【发布时间】:2012-01-23 01:44:10
【问题描述】:

有两个<input type="submit">的形式。但是当我发送它时,第二次提交会导致错误。

布局

<form action="{{ url_for('index') }}" method="post">
    <input type="submit" name="add" value="Like">
    <input type="submit" name="remove" value="Dislike">
</form>

main.py

...
if request.method == 'POST':
    if request.form['add']:
        return redirect(url_for('index'))
    elif request.form['remove']:
        return redirect(url_for('index'))
...

第一次提交(添加)效果很好,但第二次(删除)...:

错误请求浏览器(或代理)发送了一个此服务器无法理解的请求。

我该如何解决这个错误?

UPD

这很简单: request.form 返回 ImmutableMultiDict:

... 
if 'Like' in request.form.values():
     ...
elif 'Dislike' in request.form.values():
     ...

【问题讨论】:

标签: python forms flask


【解决方案1】:

正如@Blubber 指出的那样,问题是当 Flask 在 argsform 字典中找不到键时会引发 HTTP 错误。 Flask 的默认假设是,如果您要求一个特定的键而它不存在,那么请求中会遗漏一些东西,整个请求是无效的。

还有另外两种处理你的情况的好方法:

  1. 使用request.form.get方法:

    if request.form.get('add', None) == "Like":
        # Like happened
    elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
  2. 对两个提交元素使用相同的name 属性:

    <input type="submit" name="action" value="Like">
    <input type="submit" name="action" value="Dislike">
    
    # and in your code
    if request.form["action"] == "Like":
        # etc.
    

【讨论】:

  • 我在模板中使用了“id”,它抛出了 400 bad request 错误。 然后我将其更改为“name”,请求现在被接受。 谢谢
  • 这种行为有点出乎意料。至少希望有日志行或回溯。
  • @ffledgling 如果错误消息提供的信息过多,则存在安全问题。尽管如此,我还是会欣赏错误日志中不那么神秘的东西。我一直在重新学习 400 BAD REQUEST 在 Flask 中的含义。
【解决方案2】:

您应该检查'add''remove' 键是否在request.form 字典中。

if request.method == 'POST':
    if 'add' in request.form:
        return redirect(url_for('index'))
    elif 'remove' in request.form:
        return redirect(url_for('index'))

当你点击 Like 时它不会失败,因为第一个条件得到满足,因此第二个条件永远不会被检查。但是,如果单击 Dislike 按钮,则第一个条件将引发 KeyError 异常,因为 request.form 不包含名为 'add' 的键。

【讨论】:

  • 没有任何其他错误,尽管调试模式已打开。我已经尝试过您的变体,但是再次出现错误:400 Bad Request。
  • 我假设你在代理后面运行 Flask?您确定终端(或您启动应用程序的任何地方)没有异常吗?
  • 不,我没有在代理后面运行 Flask。我试过 try/except 块:400:错误请求。终端中没有任何其他异常。我也尝试过制作两个表单,每个表单都有一个提交按钮,但结果是一样的:第二个提交导致 400 错误。
  • 在这种情况下没有其他错误。没有追溯。就是那个“不那么无用”的输出。
【解决方案3】:

使用&lt;button type="submit"&gt; 代替&lt;input type="submit"&gt;。我和你有同样的错误,尝试了很多解决方案,但没有一个奏效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多