質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

1回答

1674閲覧

flask API にcurl command でPOSTしたところBad Requestのメッセージがコンソールに出ました。

hit701

総合スコア148

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

0グッド

0クリップ

投稿2022/11/17 03:57

編集2022/11/18 08:40

前提

flask APIをpythonにて構築し、flaskが起動している時に下記のコマンドを送信しました。

curl -X POST http://127.0.0.1:5000/detect -H "Content-Type: application/json" -d '{"filename": "xxx.jpg"}'

すぐに下記のエラーメッセージが発生しました。

<!doctype html> <html lang=en> <title>400 Bad Request</title> <h1>Bad Request</h1> <p>Failed to decode JSON object: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)</p>

実現したいこと

pythonで構築したflask APIにて下記の様なjsonが返ってきて欲しいです。

response : {"camera": 12, "lens":100}

最小限のコードを記述します。
ディレクトリがapiの中にあるflask_test.pyを呼び出しています。

__init__.py

1from flask import Blueprint, jsonify, request 2 3from api import flask_test 4 5 6api = Blueprint("api", __name__) 7 8 9@api.get("/") 10def index(): 11 return jsonify({"column": "value"}), 201 12 13@api.post("/detect") 14def detection(): 15 return flask_test.detection(request) 16

flask_test.py

1 2def load_image(request): 3 print('----')  # curlを打ち込みますとコンソールに表示されます。 4 filename = request.json["filename"] 5 print(filename)  # コンソールに表示されません。 6 7 8def detection(request): 9 print("test") # 表示されます。 10 load_image(request) 11

flaskのblueprintによる起動コードを書きます。

app.py

1 2import os 3from flask import Flask 4 5from api import api 6 7 8class Config: 9 TESTING = False 10 DEBUG = False 11 LABELS = [ 12 "people", 13 "Population" 14 ] 15 16 17class LocalConfig(Config): 18 TESTING = True 19 DEBUG = True 20 21 22config = { 23 "base": Config, 24 "local": LocalConfig, 25} 26 27config_name = os.environ.get("CONFIG", "local") 28 29app = Flask(__name__) 30app.config.from_object(config[config_name]) 31 32app.register_blueprint(api) 33 34 35# @app.route("/") 36# def index(): 37# return "Hello" 38

起動後、ポート5000には、
{
"column": "value"
}
が表示されます。

その起動中に上記のcurlコマンドを打ち込みますと、Bad Requestとなります。
下図は、リクエストした後のターミナル画面を表した画面です。

イメージ説明

コンソール画面です。
testのあと、----が表示されますが、その後のprint文 print(filename) が表示されません。

イメージ説明

この様な結果、request.json["filename"] が原因箇所となりますが対策方法が見つかっておりません。

ご指導の程よろしくお願いします

補足情報(FW/ツールのバージョンなど)

OS: WIN10
python: 3.9.13
flask: 2.2.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

さすがにコード無しでこういう質問をするのは、回答者にエスパーを求めすぎではないですか?

当てずっぽうで回答してみます!

POSTが許可されていない場合は、405 Method Not Allowedになるはずなので、許可はされているはずです。

適当に検索したところ、以下の記事が見つかりました。
https://stackoverflow.com/questions/62025843/flask-keras-pfailed-to-decode-json-object-expecting-property-name-enclosed-i

curlのjsonにescapeが必要なんじゃないかと思います。

解決しない場合は、これ以上エスパーするのは無理そうなので、現象が再現する最小のコードの提供をお願いします。

2022/11/18 18:51追記

修正ありがとうございます。
掲載いただいたコードを実行してみましたが、実行できませんでした。
実行できることを確認して投稿していますか?

複数ファイルに跨がったプログラムを掲載する場合は、フォルダ/ファイル構造も記載いただかないと、どのように配置するのかが分かりません。
また、エラーメッセージは省略すること無く全文をテキストで掲載ください。

コードは実行できないので、適当に改造して実行してみました。

以下のコードで確認できると思います。

python

1from flask import Flask, request 2 3app = Flask(__name__) 4 5if __name__ == '__main__': 6 app.run() 7 8 9@app.post("/detect") 10def detectio(): # これは同じ名前の関数が2個になってしまっていたので、1文字削りました。誤字ではないです。 11 ret = detection() 12 return ret 13 14 15def load_image(): 16 print('----') 17 filename = request.json["filename"] 18 print(filename) 19 20 21def detection(): 22 print("test") 23 load_image() 24 25

curlが投げられる環境を作るのが面倒だったので、以下のHTTPリクエストを送信しました。

POST http://localhost:5000/detect Accept: application/json {"filename": "xxx.jpg"}

POSTでやる意味ないですが、念のため。

これを実行した結果は以下です。

text

1test 2---- 3127.0.0.1 - - [18/Nov/2022 19:08:21] "POST /detect HTTP/1.1" 400 -

reequest.jsonは内部的にget_jsonを呼んでいるそうです。

get_json

MIMEタイプがapplication/jsonでない、もしくはjsonの解析に失敗した場合、400を返すと書いてあるので、値が取れていないんじゃないかと思います。
PyCharmなどを使って、ブレークを設定し、requestに何が入っているのか確認してみるのが近道だと思います。
(私のやり方の場合は、request.dataにはデータが入っていました。)

また、Flaskで@appや@blueprintでデコレートされている関数は、有効な応答を返す必要があります。
具体的には、detectのreturnをreturn Noneとかにして上げるとエラーが出て分かると思います。

text

1TypeError: The view function did not return a valid response. The return type must be a string, dict, list, tuple with headers or status, Response instance, or WSGI callable, but it was a bool.

エラーは上記の通りです。
returnには、stringか、dictか、listか、ヘッダかステータスを含むtupleか、Responseである必要があります。
detection()で何か返すか、@app.post("/detect")のreturnにreturn 'OK'とか返すか、とりあえず何か返してください。

投稿2022/11/17 04:32

編集2022/11/18 10:23
FiroProchainezo

総合スコア2401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hit701

2022/11/17 07:08

早速のご回答誠にありがとうございます。 escapeではコマンドを受け付けませんでした。 そうですね。最小限のコードを記述します 405 Method Not Allowed なるほど、許可はされていると。 勉強になります。
FiroProchainezo

2022/11/17 13:26

実行できません。 現象が再現する最小のコードの提供をお願いします。 質問文に掲載のコードでは、POSTは許可されていないようです。 もしかして、わざと回答が難しいように質問していますか?
hit701

2022/11/17 15:01

お時間頂いて誠にすいません。 結構ややこしいコードでどこまでが現象が再現する最小のコードか自分で考えてから改めて投稿します。
hit701

2022/11/18 08:33

起動コードも記載した現象が再現する最小のコードを質問欄に追記しました。 caluculation.pyをflask_test.pyの中で必要なコードだけを記載しました。
hit701

2022/11/28 16:02

機械学習につながるコードで今後うまくできましたら、報告させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問