web-dev-qa-db-fra.com

Erreur d’envoi du formulaire, Flask

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

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:

  1. Utilisation request.form _ .get méthode:

    if request.form.get('add', None) == "Like":
        # Like happened
    Elif request.form.get('remove', None) == "Dislike":
        # Dislike happened
    
  2. 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.
    
87
Sean Vieira

Vous devriez vérifier si le 'add' et 'remove' Les clés sont dans le request.formdict.

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'.

3
Blubber