web-dev-qa-db-ja.com

フォーム送信エラー、Flask

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():
     ...
55
dimazubrik

@Blubberが指摘しているように、問題はFlaskがargsおよびform辞書でキーを見つけられなかったときにHTTPエラーを発生させることです。 Flaskは、デフォルトで特定のキーを要求している場合それが存在しない場合であるため、何かがリクエストから取り残され、リクエスト全体が無効であると仮定します。

状況に対処するには、他にも2つの良い方法があります。

  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.
    
87
Sean Vieira

'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例外をスローします。

3
Blubber