有两个<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():
...
答案 0 :(得分:87)
正如@Blubber所指出的那样,问题是当Flask无法在args
和form
字典中找到密钥时会引发HTTP错误。 Flask默认假设的是,如果您要求某个特定的密钥并且它不存在,那么请求中遗漏了一些内容,整个请求都无效。
还有另外两种处理您情况的好方法:
使用request.form
&#39; .get
方法:
if request.form.get('add', None) == "Like":
# Like happened
elif request.form.get('remove', None) == "Dislike":
# Dislike happened
对两个提交元素使用相同的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">
。我遇到了与您相同的错误,并尝试了太多解决方案,但没有任何作用