Що є причиною помилки з помилковим запитом при поданні форми в програмі Flask?


79

Після прочитання багатьох подібних проблем із звучанням та відповідних документів 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. Підтримка назв є обов’язковою. Більше можна прочитати у цьому питанні Помилка надсилання форми, Flask



@SeanVieira у мене є; хоч і спричинила ту саму помилку, проблема, здавалося, виникла в тому, що він намагався подати форму за допомогою двох різних кнопок на одній сторінці - проблема полягала в диференціації між ними - тоді як у мене є лише одна кнопка, яка викликає POST.
zch

5
Сміх Вибачте, це мало бути чіткіше - "Flask викликає помилку HTTP, коли не вдається знайти ключ у аргументах та сформувати словники" - одне з полів, до якого ви намагаєтесь отримати доступ request.form, відсутнє (наприклад, ви надсилаєте name_feildта шукаєте for name_field- зверніть увагу на неправильне написання), отже, помилка. (Налаштування app.debug = Trueдопоможе вам знайти помилку).
Шон Вієйра

Відповіді:


135

Рішення було простим та розкритим у коментарях. Як зазначено у цьому питанні, помилка надсилання форми, Flask , і на яку вказує Шон Віейра ,

... проблема полягає в тому, що Flask викликає помилку HTTP, коли не вдається знайти ключ у аргументах та сформувати словники. За замовчуванням Flask припускає, що якщо ви запитуєте певний ключ, а його немає, тоді щось залишилось поза запитом, і весь запит недійсний.

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

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

в той час як у Python, коли був виклик POST, я захоплюю неіснуючу форму за допомогою

request.form['question1']

тоді як для узгодження з моїми іменами форм HTML це повинно було бути

request.form['question1_field']

Сподіваюся, це допоможе.


11
Ви також можетеrequest.form.get('key', default_value)
OdraEncoded

1
@OdraEncoded ваше рішення вирішило проблему. Я не думав про це, але dict.get()повертається, Noneщо безпечніше, ніж доступ безпосередньо за допомогою ключа, який може спричинити, KeyErrorа отже, і програму програми.
Пиріг "Ой" Па

<input name = "must_match">
jasonleonhard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.