2つの<input type="submit">
を持つフォームがあります。しかし、私がそれを送信しているとき、2回目の送信はエラーを引き起こします。
レイアウト:
<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'))
...
最初のsubmit(add)はうまく機能しますが、second(remove)...:
Bad Requestブラウザ(またはプロキシ)は、このサーバーが理解できない要求を送信しました。
このエラーを修正するにはどうすればよいですか?
[〜#〜] upd [〜#〜]:
Request.formはImmutableMultiDictを返します:
...
if 'Like' in request.form.values():
...
Elif 'Dislike' in request.form.values():
...
@Blubberが指摘しているように、問題はFlaskがargs
およびform
辞書でキーを見つけられなかったときにHTTPエラーを発生させることです。 Flaskは、デフォルトで特定のキーを要求している場合それが存在しない場合であるため、何かがリクエストから取り残され、リクエスト全体が無効であると仮定します。
状況に対処するには、他にも2つの良い方法があります。
つかいます 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.
'add'
および'remove'
キーがrequest.form
dictにあるかどうかを確認する必要があります。
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をクリックすると、最初の条件が満たされるため失敗しません。したがって、2番目の条件はチェックされません。しかしDislikeボタンがクリックされると、request.form
には'add'
という名前のキーが含まれていないため、その最初の条件はKeyError
例外をスローします。