在Flask应用程序中提交表单时,错误请求错误的原因是什么?

zch*_*zch 75 python forms post bad-request flask

在阅读了许多类似的声音问题和相关的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")
Run Code Online (Sandbox Code Playgroud)

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">
    ...
Run Code Online (Sandbox Code Playgroud)

对于大多数人来说,问题并没有打电话GETPOST,但我在这两个功能正是这样做的,我仔细检查了,以确保我一切进口必要的,如from flask import request.我还询问了数据库并确认没有添加表单中的添加内容.

在Flask应用程序中,我正在请求HTML表单中标记略有不同的表单字段.保持名称一致是必须的.更多可以在这个问题上阅读表格发送错误,烧瓶

zch*_*zch 129

解决方案很简单,并在评论中发现.正如在这个问题中提到的,表格发送错误,Flask,并由Sean Vieira指出,

...问题是当Flask无法在args中找到密钥并形成字典时,会引发HTTP错误.Flask默认假设的是,如果您要求某个特定密钥并且它不存在,那么请求中遗漏了一些内容,整个请求无效.

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

<input name="question1_field" placeholder="question one">
Run Code Online (Sandbox Code Playgroud)

而在Python中,当有一个POST被调用时,我抓住一个不存在的表单

request.form['question1']
Run Code Online (Sandbox Code Playgroud)

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

request.form['question1_field']
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • 你也可以`request.form.get('key',default_value)` (11认同)