表单发送错误,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在args
和form
词典中找不到关键字时会引发一个HTTP错误。 Flask默认使用的是,如果你要求一个特定的密钥而不存在,那么请求中就会有一些东西被遗漏,而整个请求是无效的。
还有两个好方法来处理你的情况:
-
使用
request.form
的.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.
您可以从发布的实际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的键。