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

Прочитав множество похожих проблем со звуком и соответствующие документы 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="[email protected]">
    ...

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

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


person zch    schedule 31.12.2012    source источник
comment
Вы видели stackoverflow.com/questions/8552675/form-sending-error -flask   -  person Sean Vieira    schedule 01.01.2013
comment
@SeanVieira У меня есть; хотя и вызывает ту же ошибку, проблема, похоже, возникла из-за того, что он пытался отправить форму с помощью двух разных кнопок на одной странице - проблема заключалась в различении между ними - тогда как у меня есть только одна кнопка, вызывающая POST.   -  person zch    schedule 01.01.2013
comment
Посмеивается Извините, должно было быть более ясным - Flask выдает ошибку HTTP, когда не может найти ключ в аргументах и ​​сформировать словари - одно из полей, к которым вы пытаетесь получить доступ в request.form, отсутствует ( например, вы отправляете name_feild и ищете name_field - обратите внимание на орфографическую ошибку), следовательно, ошибка. (Установка app.debug = True поможет вам найти ошибку).   -  person Sean Vieira    schedule 01.01.2013


Ответы (1)


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

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

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

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

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

request.form['question1']

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

request.form['question1_field']

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

person zch    schedule 01.01.2013
comment
Вы также можете request.form.get('key', default_value) - person OdraEncoded; 13.01.2016
comment
@OdraEncoded ваше решение устранило проблему. Я не думал об этом, но dict.get() возвращает None, что безопаснее, чем доступ с использованием ключа напрямую, что может вызвать KeyError и, следовательно, привести к сбою приложения. - person Pie 'Oh' Pah; 13.12.2016
comment
‹Input name = must_match› - person jasonleonhard; 14.10.2017