【问题标题】:What is the cause of the Bad Request Error when submitting form in Flask application?在 Flask 应用程序中提交表单时出现错误请求错误的原因是什么?
【发布时间】:2012-12-15 20:10:13
【问题描述】:

在阅读了许多类似的听起来问题和相关的 Flask 文档后,我似乎无法弄清楚是什么在提交表单时产生了以下错误:

400 错误请求

浏览器(或代理)发送了此服务器无法理解的请求。

虽然表单始终正确显示,但当我提交与以下任一功能相关的 HTML 表单时会出现错误请求:

@app.route('/app/business', methods=['GET', 'POST'])
def apply_business():
    if request.method == 'POST':    
        new_account = Business(name=request.form['name_field'], email=request.form['email_field'], account_type="business", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success'))
    return render_template('application.html', accounttype="business")          

@app.route('/app/student', methods=['GET', 'POST'])
def apply_student():    
    if request.method == 'POST':    
        new_account = Student(name=request.form['name_field'], email=request.form['email_field'], account_type="student", 
            q1=request.form['q1_field'], q2=request.form['q2_field'], q3=request.form['q3_field'], q4=request.form['q4_field'], 
            q5=request.form['q5_field'], q6=request.form['q6_field'], q7=request.form['q7_field'], q8=request.form['q8_field'], 
            q9=request.form['q9_field'], q10=request.form['q10_field'],
            account_status="pending", time=datetime.datetime.utcnow())
        db.session.add(new_account)
        db.session.commit()
        session['name'] = request.form['name_field']    
        return redirect(url_for('success')) 
    return render_template('application.html', accounttype="student")

HTML的相关部分是

<html>
<head>
    <title>apply</title>
</head>
<body>
    {% if accounttype=="business" %}
    <form action="{{ url_for('apply_business') }}" method=post class="application_form">
    {% elif accounttype=="student" %}
    <form action="{{ url_for('apply_student') }}" method=post class="application_form">     
    {% endif %} 
    <p>Full Name:</p>
    <input name="name_field" placeholder="First and Last">
    <p>Email Address:</p>
    <input name="email_field" placeholder="your@email.com">
    ...

大多数人的问题不是调用GETPOST,但我在这两个函数中都这样做,我仔细检查以确保我导入了所有必要的东西,例如from flask import request。我还查询了数据库,确认没有添加表单中的添加内容。

在 Flask 应用程序中,我请求的表单字段在 HTML 表单中的标记略有不同。保持名称一致是必须的。更多可以阅读这个问题Form sending error, Flask

【问题讨论】:

  • @SeanVieira 我有;虽然导致了同样的错误,但问题似乎是由于他试图从同一页面上的两个不同按钮提交表单 - 问题在于区分两者 - 而我只有一个调用 POST 的按钮。
  • Chuckles 抱歉,应该更清楚 - “Flask 在无法在 args 和表单字典中找到键时引发 HTTP 错误” - 您的字段之一正在尝试访问request.form 不存在(例如,您发送name_feild 并寻找name_field - 注意拼写错误),因此出现错误。 (设置app.debug = True会帮助你找到错误)。

标签: python forms post flask bad-request


【解决方案1】:

解决方案很简单,并且在 cmets 中没有发现。正如这个问题中提到的,Form sending error, Flask,并由Sean Vieira 指出,

...问题是 Flask 在找不到 键入 args 并形成字典。 Flask 默认假设什么 是,如果您要一个特定的密钥并且它不存在那么 请求中遗漏了一些东西,整个请求是 无效。

换句话说,如果在 HTML 中找不到您在 Python 中请求的一个表单元素,则 POST 请求无效并出现错误,在我的情况下,回溯中没有任何违规行为。对我来说,这是拼写缺乏一致性:在 HTML 中,我标记了各种表单输入

<input name="question1_field" placeholder="question one">

在 Python 中,当调用 POST 时,我用

抓取了一个不存在的表单
request.form['question1']

然而,为了与我的 HTML 表单名称保持一致,它需要是

request.form['question1_field']

我希望这会有所帮助。

【讨论】:

  • 你也可以request.form.get('key', default_value)
  • @OdraEncoded 你的解决方案解决了这个问题。我没想到,但dict.get() 返回None,这比直接使用密钥访问更安全,这可能导致KeyError 并因此导致应用程序崩溃。
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
  • 2023-04-10
  • 2018-02-03
相关资源
最近更新 更多