В чем причина ошибки неправильного запроса при отправке формы в приложении Flask?

после прочтения многих подобных проблем звучания и соответствующих документов колбы, я не могу понять, что генерирует следующую ошибку при отправке формы:

400 Плохой Запрос

браузер (или прокси) послал запрос, что этот сервер не мог понять.

хотя форма всегда отображается правильно, плохой запрос происходит, когда я отправляю HTML-форму, которая привязывается к любой из этих функций:

@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")

соответствующей частью HTML является

<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="your@email.com">
    ...

проблема для большинства людей не звал GET или POST, но я делаю именно это в обеих функциях, и я дважды проверил, чтобы убедиться, что я импортировал все необходимое, например from flask import request. Я также запросил базу данных и подтвердил, что дополнения из формы не были добавлены.

в приложении Flask я запрашивал поля формы, которые были помечены немного иначе в форме HTML. Соответствие согласованность имен является обязательным условием. Подробнее можно прочитать на этом вопросе ошибка отправки формы, колба

1 ответов


решение было простым и открытым в комментариях. Как говорится в этом вопросе, ошибка отправки формы, фляга, и указал Шон Виейра,

...проблема в том, что Flask вызывает ошибку HTTP, когда ей не удается найти ключ в args и формируют словари. Что Flask предполагает по умолчанию это если вы просите конкретный ключ, а его там нет, то что-то осталось из запроса и весь запрос недействительный.

другими словами, если только один элемент формы, который вы запрашиваете в Python, не может быть найден в HTML, то запрос POST недействителен и появляется ошибка, в моем случае без каких-либо нарушений в обратной трассировке. Для меня это было отсутствие согласованности с орфографией: в HTML я помечал различные формы ввода

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

в то время как в Python, когда был вызван пост, я хватаю несуществующую форму с

request.form['question1']

тогда, чтобы быть последовательным с моими именами HTML-форм это должно быть

request.form['question1_field']

надеюсь, это поможет.