Неверный запрос 400 с флягой и HTML-формой

0

У меня есть форма (созданная в 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 - как показано ниже

Изображение 174551

Теги:
flask
forms
post

2 ответа

3
Лучший ответ

У вас есть две проблемы:

  1. Если флажок question не установлен, в поле данных POST не будет question. Флажок вызывает подкласс KeyError при недействительном KeyError ключей в args и form (как обычный словарь Python). Это отображается как ошибка 400. Если поле является необязательным, используйте request.form.get('question')

  2. Аргументом для url_for должно быть имя контроллера (в данном случае processData), а не URL.

  • 0
    Да, я проверял это, не проверяя ни одну из коробок. Это потрясающе! Я включил request.form.get, и он больше не выдает ошибку, если я ничего не ввожу. Спасибо!
0

У вас есть небольшая опечатка:

 @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') }}"
  • 0
    Это привело бы к ошибке 404 Not Found.
  • 0
    Когда вы используете url_for() аргумент должен быть именем метода представления, а не URL. Смотри ответ Шона.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню