Il y a une forme avec deux <input type="submit">
. Mais quand je l'envoie, la deuxième soumission provoque une erreur.
layout :
<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'))
...
Premièrement soumettre (ajouter) fonctionne bien, mais deuxième (supprimer) ...:
Bad Request Le navigateur (ou le proxy) a envoyé une requête que ce serveur n'a pas pu comprendre.
Comment puis-je réparer cette erreur?
UPD :
C'était assez simple: request.form renvoie ImmutableMultiDict:
...
if 'Like' in request.form.values():
...
Elif 'Dislike' in request.form.values():
...
Comme le souligne @Blubber, le problème est que Flask génère une erreur HTTP lorsqu'il ne parvient pas à trouver une clé dans les dictionnaires args
et form
. What = Flask suppose par défaut que si vous demandez une clé particulière et ce n'est pas là alors quelque chose a été omis de la demande et toute la demande est invalide.
Il existe deux autres moyens de gérer votre situation:
Utilisation request.form
_ .get
méthode:
if request.form.get('add', None) == "Like":
# Like happened
Elif request.form.get('remove', None) == "Dislike":
# Dislike happened
Utilisez le même attribut name
pour les deux éléments de soumission:
<input type="submit" name="action" value="Like">
<input type="submit" name="action" value="Dislike">
# and in your code
if request.form["action"] == "Like":
# etc.
Vous devriez vérifier si le 'add'
et 'remove'
Les clés sont dans le 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'))
Lorsque vous cliquez sur J'aime, cela n'échoue pas car la première condition est remplie et, par conséquent, la seconde n'est jamais vérifiée. Mais si le bouton Dislike est cliqué, cette première condition lève une exception KeyError
parce que request.form
ne contient pas de clé nommée 'add'
.