使用Flask的错误请求

时间:2016-11-05 20:23:45

标签: python flask

真的很难接受这个来自烧瓶的坏请求。我通常知道它是由于烧瓶没有在表格中找到[键]而引起的。但是,我已经检查了我的表格和python代码40次,看不出任何理由。我已经注释掉每个引用request.form的python代码行。我已经做到了1比1,我仍然得到一个糟糕的要求。然而,当我评论所有的行时,坏的请求消失了......任何想法都会很棒......

Python代码;

if request.method == 'POST':
    form = 'Add Package Form'
    clientId = request.form['id']
    date = request.form['date2']
    strPrice = request.form['price']
    price = float(strPrice)
    adultlessons = request.form['adult']
    juniorlessons = request.form['junior']
    shortlessons = request.form['short']
    playinglessons = request.form['playing']
    notes = request.form['notes']

形式..

<form action="/addpackage" method="post" class="sky-form">
                <fieldset>
                <section>
                    <label class="label">Select Package Date</label>    
                    <label class="input">
                        <i class="icon-append fa fa-calendar"></i>
                        <input type="text" name="date2" id="date">
                    </label>
                </section>
                <div style="margin: -25px"></div>
            <fieldset>
                <section>
                    <label class="label">Price</label>
                    <label class="input">
                        <input type="text" name="price">
                    </label>
                </section>
                <section>
                    <label class="label">Adult Lessons</label>
                    <label class="input">
                        <input type="text" name="adult">
                    </label>
                </section>
                <section>
                    <label class="label">Junior Lessons</label>
                    <label class="input">
                        <input type="text" name="junior">
                    </label>
                </section>
                <section>
                    <label class="label">Short Game Lessons</label>
                    <label class="input">
                        <input type="text" name="short">
                    </label>
                </section>
                <section>
                    <label class="label">Playing Lessons</label>
                    <label class="input">
                        <input type="text" name="playing">
                    </label>
                </section>
                <section>
                    <label class="label">Notes</label>
                    <label class="textarea textarea-expandable">
                        <textarea rows="3" name="notes"></textarea>
                    </label>
                    <div class="note"><strong>Note:</strong> expands on focus.</div>
                </section>
            </fieldset>
                </fieldset>
            <!-- hidden client id -->
            <input type="hidden" name="id" value="{{ client.id }}">
            <!-- /hidden client id -->
            <footer>
                <button type="submit" name="addpackage" value="package" class="button">Add Package</button>
            </footer>
        </form>

3 个答案:

答案 0 :(得分:1)

这是一个半答案,但是评论太长了。

如果您在Flask应用程序中启用调试,您应该获得详细的回溯,指出问题发生的确切位置(在浏览器和控制台上)。

如果您的申请目前有类似的内容:

app.run()

只需将debug参数设置为true

即可
app.run(debug=True)

如果在启用调试后仍然不确定导致问题的原因,请更新您的问题以包含回溯。

对于它的价值,如果我将您的表单和代码转储到一个简单的Flask应用程序中,只要我为price字段提供数值,它似乎都可以正常工作 EM>

答案 1 :(得分:1)

通常,当您尝试访问不存在的400 Bad Request对象中的表单密钥时,在提交表单时,您会在Flask中获得request

这是因为request.form对象在__getitem__模块中继承了Multidict类,werkzeug.datastructures模块会引发BadRequestKeyError when a key doesn't exist

答案 2 :(得分:0)

您应该为表单数据提供一个默认值以避免HTTP 400错误,如下所示:

default_value = True
is_public = request.form.get('public', default_value)

但是,我建议您使用Flask-WTF 使用Flask-WTF,您的代码可以简化为此(示例):

import ...
app = Flask(__name__)

class EditProfileForm(Form):
    name = StringField('name', validators=[Length(0, 64)])
    location = StringField('city', validators=[Length(0,64)])
    website = StringField('website', validators=[Length(0,64), render_kw={"placeholder": "http://..."})
    about_me = TextAreaField('Bio', validators=[Length(0,2000)], render_kw={"placeholder": "I'm......"})
    submit = SubmitField(u'submit')

@app.route('/edit-profile', methods=['GET', 'POST'])
def edit_profile():
    form = EditProfileForm()
    if form.validate_on_submit():
        current_user.name = form.name.data
        current_user.location = form.location.data
        current_user.website = form.website.data
        current_user.about_me = form.about_me.data
        db.session.add(current_user)
        flash('Update success!', 'success')
        return redirect(url_for('.user', username=current_user.username))
    return render_template('edit_profile.html', form=form)

在你的html文件中:

<form method="POST" action="/">
    {{ form.hidden_tag() }}
    {{ form.name.label }} {{ form.name() }}
    {{ form.location.label }} {{ form.location() }}
    ...
</form>

顺便说一下,如果你使用Flask-Bootstrap,你可以使用一行来渲染整个表格:

{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}

我希望它会有所帮助。