83

多くの同様の問題と関連する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">
    ...

ほとんどの人にとっての問題は、GETまたはPOSTを呼び出すことではありませんでしたが、私は両方の関数でそれを行っており、from flask import request. また、データベースにクエリを実行し、フォームからの追加が追加されていないことを確認しました。

Flask アプリでは、HTML フォームでわずかに異なるラベルが付けられたフォーム フィールドをリクエストしていました。名前の一貫性を維持することは必須です。この質問で詳細を読むことができますフォーム送信エラー、Flask

4

1 に答える 1

139

解決策は簡単で、コメントで明らかになりました。この質問、フォーム送信エラー、Flaskで対処され、 Sean Vieiraによって指摘されたように、

...問題は、引数とフォーム辞書でキーが見つからない場合に、Flask が HTTP エラーを発生させることです。Flask がデフォルトで想定しているのは、特定のキーを要求していて、それが存在しない場合、リクエストから何かが除外され、リクエスト全体が無効であるということです。

つまり、Python でリクエストしたフォーム要素が 1 つでも HTML で見つからない場合、POST リクエストは無効になり、エラーが表示されます。私の場合、トレースバックに異常はありません。私にとっては、スペルとの一貫性の欠如でした。HTML では、さまざまなフォーム入力にラベルを付けました。

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

Pythonでは、POSTが呼び出されたときに、存在しないフォームを取得します

request.form['question1']

一方、私の HTML フォーム名と一致させるには、

request.form['question1_field']

これが役立つことを願っています。

于 2013-01-01T20:28:22.360 に答える