После прочтения множества похожих проблем со звуком и соответствующих документов 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
request.form
отсутствует (например, вы отправляетеname_feild
и ищете forname_field
- обратите внимание на орфографическую ошибку), следовательно, ошибка. (Настройкаapp.debug = True
поможет найти ошибку).Ответы:
Решение было простым и раскрыто в комментариях. Как указано в этом вопросе, ошибка отправки формы, Flask , и указано Шоном Виейрой ,
Другими словами, если только один элемент формы, который вы запрашиваете в Python, не может быть найден в HTML, тогда запрос POST недействителен и ошибка появляется, в моем случае без каких-либо нарушений в трассировке. Для меня это было несогласованность с орфографией: в HTML я помечал различные входные данные формы
<input name="question1_field" placeholder="question one">
в то время как в Python, когда был вызван POST, я беру несуществующую форму с
request.form['question1']
тогда как, чтобы соответствовать моим именам HTML-форм, он должен был быть
request.form['question1_field']
Надеюсь, это поможет.
источник
request.form.get('key', default_value)
dict.get()
возвращает,None
что безопаснее, чем доступ с использованием ключа напрямую, что может вызватьKeyError
и, следовательно, сбой приложения.