表单发送错误,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(): ... 

正如@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. 

您可以从发布的实际exception开始,而不是来自Web服务器的或多或less的无用输出。 无论如何,我的猜测是你应该检查'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')) 

当你点击喜欢它不会因为满足第一个条件而失败,因此第二个不会被检查。 但是如果单击Dislikebutton,则第一个条件将抛出一个KeyErrorexception,因为request.form字典不包含名为add的键。