У меня есть форма (созданная в index.html). Однако, когда я нажимаю кнопку "Отправить", я получаю ошибку 400 Bad Request. Я думаю, что это связано с моими приложениями в Flask, но я не могу найти решение...
В Index.html (выдержка):
<form class="demographic-form" action="/getsurveyresult" method="post"> Question: <br> <input type="checkbox" name="question" value="yes">Check this box! <br> <input type="submit" id="submitButton" value="Submit"> </form>
В app.py:
from flask import *
import json
app = Flask(__name__)
app.debug = True
app.vars = {}
@app.route("/")
def index():
return render_template("index.html")
@app.route('/getsurveyresults', methods=['POST'])
def processData():
app.vars['question'] = request.form['question']
f = open('data.txt' ,'w')
f.write('question: %s\n' %(app.vars['question']))
f.close()
return render_template("getsurveyresults.html")
if __name__ == "__main__":
app.run()
У меня есть скрипт getsurveyresults.html в той же папке, что и index.html. У Index.html нет рендеринга проблем.
PS Я попытался заменить action = "/getsurveyresult" на action = "{{url_for ('getsurveyresult')}}" но я получил werkzeug.routing.BuildError - как показано ниже
У вас есть две проблемы:
Если флажок question
не установлен, в поле данных POST не будет question
. Флажок вызывает подкласс KeyError
при недействительном KeyError
ключей в args
и form
(как обычный словарь Python). Это отображается как ошибка 400. Если поле является необязательным, используйте request.form.get('question')
Аргументом для url_for
должно быть имя контроллера (в данном случае processData
), а не URL.
У вас есть небольшая опечатка:
@app.route('/getsurveyresults')
<form class="demographic-form" action="/getsurveyresult"
Вам нужно изменить @app.route на /getsurveyresult (без окончательного s) или изменить действие формы на /getsurveyresultS (с окончательным s). Вы также можете использовать функцию flask url_for:
<form class="demographic-form" action="{{ url_for('processData') }}"
url_for()
аргумент должен быть именем метода представления, а не URL. Смотри ответ Шона.