带有Flask和HTML表单的400 Bad Request

时间:2014-02-18 19:05:25

标签: python html forms post flask

我有一个表单(在index.html中创建)。 但是,当我点击提交时,我收到400错误请求错误。我认为它与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()

我在index.html所在的文件夹中有一个getsurveyresults.html脚本。 Index.html没有问题呈现。

P.S。我尝试用action =“{{url_for('getsurveyres')}}替换action =”/ getsurveyresult“但是我得到了一个werkzeug.routing.BuildError - 如下所示

enter image description here

2 个答案:

答案 0 :(得分:3)

你有两个问题:

  1. 如果未选中question复选框,则POST数据中将没有question字段。 Flask在KeyErrorargs上的无效键查找上引发了form的子类(就像普通的Python字典一样)。这显示为400错误。如果该字段是可选字段,请使用request.form.get('question')

  2. url_for的参数应该是控制器的名称(在本例中为processData),而不是URL。

答案 1 :(得分: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') }}"