web-dev-qa-db-fra.com

Quelle est la cause de l’erreur de demande incorrecte lors de la soumission du formulaire dans l’application Flask?

Après avoir lu de nombreux problèmes similaires et les docs Flask pertinents, je n'arrive pas à comprendre ce qui génère l'erreur suivante lors de la soumission d'un formulaire:

400 mauvaise demande

Le navigateur (ou le proxy) a envoyé une demande que ce serveur n'a pas pu comprendre.

Bien que le formulaire s'affiche toujours correctement, la mauvaise demande survient lorsque je soumets un formulaire HTML lié à l'une de ces fonctions:

@app.route('/app/business', methods=['GET', 'POST'])
def apply_business():
    if request.method == 'POST':    
        new_account = Business(name=request.form['name_field'], email=request.form['email_field'], account_type="business", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success'))
    return render_template('application.html', accounttype="business")          

@app.route('/app/student', methods=['GET', 'POST'])
def apply_student():    
    if request.method == 'POST':    
        new_account = Student(name=request.form['name_field'], email=request.form['email_field'], account_type="student", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], q8=request.form['q8_field'], 
            q9=request.form['q9_field'], q10=request.form['q10_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success')) 
    return render_template('application.html', accounttype="student")

La partie pertinente de HTML est

<html>
<head>
    <title>apply</title>
</head>
<body>
    {% if accounttype=="business" %}
    <form action="{{ url_for('apply_business') }}" method=post class="application_form">
    {% Elif accounttype=="student" %}
    <form action="{{ url_for('apply_student') }}" method=post class="application_form">     
    {% endif %} 
    <p>Full Name:</p>
    <input name="name_field" placeholder="First and Last">
    <p>Email Address:</p>
    <input name="email_field" placeholder="[email protected]">
    ...

Le problème pour la plupart des gens n’appelait pas GET ou POST, mais c’est ce que je fais exactement dans les deux fonctions, et j’ai vérifié deux fois pour être sûr d’importer tout le nécessaire, comme from flask import request. J'ai également interrogé la base de données et confirmé que les ajouts du formulaire n'avaient pas été ajoutés.

Dans l'application Flask, je demandais des champs de formulaire étiquetés légèrement différents dans le formulaire HTML. Garder les noms cohérents est un must. Plus peut être lu à cette question Erreur d'envoi de formulaire, Flask

74
zch

La solution était simple et découverte dans les commentaires. Comme indiqué dans cette question, Erreur d’envoi du formulaire, Flask , et signalé par Sean Vieira ,

... le problème est que Flask génère une erreur HTTP lorsqu'il ne parvient pas à trouver une clé dans les dictionnaires de formulaires et d'arguments. What Flask suppose par défaut que que si vous demandez une clé particulière et qu'elle n'y est pas, il y a quelque chose qui a été omis de la demande et toute la demande est invalide.

En d'autres termes, si un seul élément de formulaire que vous demandez dans Python ne peut pas être trouvé en HTML, la demande POST n'est pas valide et l'erreur s'affiche, Dans mon cas, il n’y avait aucune irrégularité dans le retraçage. Pour moi, c’était un manque de cohérence avec l’orthographe: dans le HTML, j’ai étiqueté diverses entrées de formulaire.

<input name="question1_field" placeholder="question one">

alors qu'en Python, quand il y avait un POST appelé, je récupère un formulaire inexistant avec

request.form['question1']

alors que, pour être cohérent avec mes noms de formulaire HTML, il devait être

request.form['question1_field']

J'espère que ça aide.

129
zch