表格发送错误,Flask

时间:2011-12-18 15:20:53

标签: python forms flask

有两个<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():
     ...

3 个答案:

答案 0 :(得分:87)

正如@Blubber所指出的那样,问题是当Flask无法在argsform字典中找到密钥时会引发HTTP错误。 Flask默认假设的是,如果您要求某个特定的密钥并且它不存在,那么请求中遗漏了一些内容,整个请求都无效。

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

  1. 使用request.form&#39; .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.
    

答案 1 :(得分:3)

您应该检查'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'的键。

答案 2 :(得分:0)

使用<input type="submit">代替<button type="submit">。我遇到了与您相同的错误,并尝试了太多解决方案,但没有任何作用