2014-02-18 17 views
0

我有一个表单(它是在index.html中创建的)。 然而,当我点击提交时,我收到一个400错误请求错误。我认为这与在瓶我的应用程序的路线做的,但我不能找出解决的办法......使用Flask和HTML格式的错误请求

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> 

在应用.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.我试图用行动代替行动= “/ getsurveyresult”= “{{url_for( 'getsurveyresult')}}”,但我有一个werkzeug.routing.BuildError - 如下图所示

enter image description here

回答

2

你有两个问题:

  1. 如果未选中question复选框,然后会出现在POST数据没有question场。 Flask在argsform(就像普通的Python字典一样)在无效密钥查找上产生KeyError的子类。这显示为400错误。如果字段是可选的使用request.form.get('question')

  2. url_for参数应该是控制器(在这种情况下processData)的名称,而不是URL。

+0

是的 - 我正在测试它没有检查任何框。太棒了!我包含了request.form.get,如果我不输入任何内容,它不会再抛出错误。谢谢! – AllieCat

0

你有一个小错字:

@app.route('/getsurveyresults') 

<form class="demographic-form" action="/getsurveyresult" 

您需要更改@ app.route到/ getsurveyresult(不含最终S),或改变形式的行动/ getsurveyresultS(与最后S)。您还可以使用烧瓶的url_for功能:

<form class="demographic-form" action="{{ url_for('processData') }}" 
+0

这会导致404 Not Found错误。 –

+0

当您使用'url_for()'时,参数应该是视图方法名称而不是URL。看到肖恩的答案。 – IanAuld

+0

像IanAuld指出的那样,URL_FOR应该指向函数名称,我修改了我的答案。 – binaryatrocity