1. ホーム
  2. python

[解決済み] Flaskアプリケーションでフォーム送信時にBad Request Errorが発生する原因は何ですか?

2023-07-05 02:24:05

質問

多くの似たような問題や関連するFlaskドキュメントを読みましたが、フォームを送信する際に以下のエラーを発生させている原因を突き止めることができません。

400 Bad Request (不正なリクエスト)

ブラウザ(またはプロキシ)が送ったリクエストは、このサーバーが理解できないものでした。

フォームは常に正しく表示されますが、これらの機能のいずれかに関連する 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="[email protected]">
    ...

多くの人にとっての問題は GET または POST など、必要なものをすべてインポートしていることを再確認しました。 from flask import request . また、データベースを照会して、フォームから追加されたものが追加されていないことを確認しました。

Flaskアプリでは、HTMLフォームで微妙にラベルが違うフォームフィールドをリクエストしていました。名前を統一しておくことは必須です。詳しくはこちらの質問で読むことができます フォーム送信エラー、Flask

どのように解決するのですか?

解決方法は簡単で、コメントで発覚しました。この質問で取り上げられたように。 フォーム送信エラー、Flask によって指摘され ショーン・ヴィエイラ ,

<ブロッククオート

...問題は、Flaskがargsとformの辞書にあるキーを見つけられなかったときにHTTPエラーを発生させることです。 を見つけることができなかった場合、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']

これが役に立てばいいのですが。