表格发送错误,Flask

dim*_*rik 56 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>
Run Code Online (Sandbox Code Playgroud)

main.py:

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

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

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

我该如何解决这个错误?

UPD:

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

... 
if 'Like' in request.form.values():
     ...
elif 'Dislike' in request.form.values():
     ...
Run Code Online (Sandbox Code Playgroud)

Sea*_*ira 88

作为@Blubber指出,问题是,当瓶它未能找到在一个关键引发HTTP错误argsform字典.Flask默认假设的是,如果您要求某个特定密钥并且它不存在,那么请求中遗漏了一些内容,整个请求无效.

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

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

    if request.form.get('add', None) == "Like":
        # Like happened
    elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
    Run Code Online (Sandbox Code Playgroud)
  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.
    
    Run Code Online (Sandbox Code Playgroud)

  • 这种行为是出乎意料的。至少希望有日志行或回溯。 (2认同)