400 Bad Request: The browser (or proxy) sent a request that this server could not understand.が出た時の対応例

Flaskでブログアプリを作成中、ブログ一覧機能を作っていた時の事。

ブログ作成ボタンを押したら下記エラー(下から6行を引用)をブラウザが吐き出してそこから進まない。

  File "/********/application/flask_blog/views/entries.py", line 29, in add_entry
    text=request.form['text']
  File "/********/.local/share/virtualenvs/application-wHqIKfO_/lib/python3.8/site-packages/werkzeug/datastructures.py", line 442, in __getitem__
    raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser (or proxy) sent a request that this server could not understand.
KeyError: 'text'

まずは一番下から”~400 Bad Request: The browser (or proxy) sent a request that this server could not understand.”をグーグルで調べる。
見つけたサイトによると

Bad Request. Your browser sent a request that this server could not understand

が濃厚。
postコマンドの内容が悪いらしい。
でも何なのか良く分からない。

この上の”~werkzeug/datastructures.py”, line 442, in getitem”の部分は恐らく自分でなんとか出来る場所では無さそう。

で、その次”~flask_blog/views/entries.py”, line 29, in add_entry
text=request.form[‘text’]”の辺りでなんか悪いのかも知れないので、views/entries.pyの29行目近辺を見てみる。

def add_entry():
    if not session.get('logged_in'):
        return redirect(url_for('login'))
    entry = Entry(
        title=request.form['title'],
        text=request.form['text']
    )
    db.session.add(entry)
    db.session.commit()
    flash('新しく記事が作成されました')
    return redirect(url_for('show_entries'))

何度見てもおかしな所は無い。
一度該当箇所を消して書き直してもブラウザは同じエラーを吐き出す。
ここは違うのかも知れない。

ふとサーバー自体の動きが気になった。

ブログ作成ボタンを押した時のサーバーサイドの反応を確認。

127.0.0.1 - - [11/Apr/2021 16:38:12] "GET /entries/new HTTP/1.1" 200 -
127.0.0.1 - - [11/Apr/2021 17:16:49] "POST /entries HTTP/1.1" 500 -
Traceback (most recent call last):
→以下エラーメッセージ

エラーの前にある”127.0.0.1 – – [11/Apr/2021 16:38:12] “GET /entries/new HTTP/1.1” 200 -“が気になって、entries/new.htmlをチェック。

(前略)
    <div class="form-group">
        <label for="InputText">本文</label>
            <textarea class="form-control" id="InputText" name=textrows="3"></textarea>
(攻略)

‘name=textrows=”3″‘のtextとrowsの間にスペースが無かった!
正しくは下記。これはコードを書いている途中に気付いておきたかった。反省。

(前略)
    <div class="form-group">
        <label for="InputText">本文</label>
            <textarea class="form-control" id="InputText" name=text rows="3"></textarea>
(攻略)

見事に解決、リスト表示が出来る様になった。

ファイル通しの繋がりがまだ掴めていないが、エラーが出た際にはブラウザの吐き出すエラーの場所だけでは無く、サーバーが吐き出すデータも見ると良さそうだ。

スポンサーリンク