Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Python

Flaskのget_json()で400 Bad Requestエラーが出た時の原因と対処

投稿日:2022年12月16日 更新日:

<目次>

Flaskのget_json()で400 Bad Requestエラーが出た時の原因と対処
 エラー内容
 原因
 対策
 参考
 余談

Flaskのget_json()で400 Bad Requestエラーが出た時の原因と対処

エラー内容

Flaskアプリをローカル実行した状態(http://127.0.0.1:5000)で、設定したエンドポイント(/sample_api/)に対して、PowerShell経由でcurlコマンドからHTTPリクエストを送った際に、下記のエラーが発生しました。

(エラーメッセージ)
<!doctype html>
<html lang=en>
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

(エラーが出たPOSTリクエスト)

curl.exe --data-binary '{"key":"val"}' -H 'content-type: application/json;' http://127.0.0.1:5000/sample_api/

(エラーが出たプログラム)

import json
from flask import Flask, request
# Flaskクラスのインスタンス生成
app = Flask(__name__)

@app.route('/sample_api/', methods=['GET', 'POST'])
def sample_api():
    print("=======", request.data)
    print("=======", json.loads(request.data, strict=False))
    print("=======", request.get_json())
    return "Hello World"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

(図151)PowerShellからcurlコマンドでリクエストを送り、400 Bad Requestエラー

(Flask結果)
127.0.0.1 – – [DD/Mon/YYYY HH:MM:SS] “POST /sample_api/ HTTP/1.1” 400 –

目次にもどる

原因

・jsonに含まれる値について、必要なエスケープ処理が出来ていないため、発生している可能性があります(有効なjson形式のデータを渡せていない)
・例えばKeyやValueの値は単にダブルクォート「”」で囲うのみならず、前にバックスラッシュ「\」でエスケープして渡す必要があります。

目次にもどる

対策

リクエストで送るJSON形式のデータについて、ダブルクォートをエスケープ処理してあげる必要があります。

(修正前)

curl.exe --data-binary '{"key":"val"}' -H 'content-type: application/json;' http://127.0.0.1:5000/sample_api/

(修正後)

curl.exe --data-binary '{\"key\":\"val\"}' -H 'content-type: application/json;' http://127.0.0.1:5000/sample_api/

PowerShellから再度テストすると、今度はレスポンスコード「200」(OK)が返ってきます。

(図152)


(Flask結果)
127.0.0.1 – – [DD/Mon/YYYY HH:MM:SS] “POST /sample_api/ HTTP/1.1” 200 –

目次にもどる

参考

・Flaskの公式ドキュメントのget_jsonメソッドの箇所も確認。
・get_json()は内部的にはrequest.dataをJSON形式でパース(構文解析と変換)している
⇒ Flask公式ドキュメント:get_json()

・例えば、敢えてNGなJSON「’{“key”:”val”}’」を入れた場合、パース元のrequest.dataは「b’{key:val}’」となり、ダブルクォートが取り除かれてしまっています。

(図153)

・この結果、get_jsonのパース(構文解析とJSON変換)に失敗していしまい、400 Bad Requestエラーが発生しています。
・一方で、OKなJSON「’{\“key\”:\”val\”}’」を入れた場合、パース元のrequest.dataは「b’{“key”:”val”}’」となり、これはget_json()でも取得可能な形になります。

(図154)


目次にもどる

余談

request.get_json()
以外にも

import json  
json.loads(request.data, strict=False)

でも似た処理が可能です。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Python
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Pythonでcsvのカラム名を変更する方法(Pandasのread_csvで読み込んだcsvのカラム名変更)

<目次> (1) Pythonでcsvのカラム名を変更する方法  (1-1) 構文①  (1-2) サンプルプログラム①  (1-3) 構文②  (1-4) サンプルプログラム② PythonのPan …

Azure DevOpsからAzure App Serviceへ自動デプロイする最短CI/CD構築ガイド

<目次> Azure DevOpsからAzure App Serviceへ自動デプロイする最短CI/CD構築ガイド  この記事のねらい  STEP1:前提準備  STEP2:サービス接続の作成  ST …

Slackのアプリを作成する手順をご紹介

  <目次> (1) Slackのアプリを作成する手順をご紹介  (1-1) Slackアプリの作成手順   ●STEP1:Slackアプリの新規作成   ●STEP2:Slackアプリの権 …

PythonのSQLAlchemyで「Identifier ‘XXX’ exceeds maximum length of 30 characters」エラーや「DtypeWarning: Columns (X) have mixed types.」警告が出た時の対処について

(0)目次&概説 (1) エラー1:sqlalchemy.exc.ArgumentError  (1-1) 発生状況・エラーメッセージ   (1-1-1) エラーメッセージ   (1-1-2) エラー …

Python3.5&Anaconda4.2のインストール手順(CentOS6)とHelloWorldの方法

(0)目次&概説 (1) インストール資源の入手  (1-1) ディストリビューション  (1-2) GitHubのpyenvのリポジトリのコピーを取得する (2) インストールの実施  (2-1) …

  • English (United States)
  • 日本語
Top