回答編集履歴

1

回答を追加。

2022/11/18 10:23

投稿

FiroProchainezo
FiroProchainezo

スコア2401

test CHANGED
@@ -11,3 +11,82 @@
11
11
 
12
12
  解決しない場合は、これ以上エスパーするのは無理そうなので、現象が再現する最小のコードの提供をお願いします。
13
13
 
14
+ # 2022/11/18 18:51追記
15
+
16
+ 修正ありがとうございます。
17
+ 掲載いただいたコードを実行してみましたが、実行できませんでした。
18
+ 実行できることを確認して投稿していますか?
19
+
20
+ 複数ファイルに跨がったプログラムを掲載する場合は、フォルダ/ファイル構造も記載いただかないと、どのように配置するのかが分かりません。
21
+ また、エラーメッセージは省略すること無く全文をテキストで掲載ください。
22
+
23
+
24
+ コードは実行できないので、適当に改造して実行してみました。
25
+
26
+ 以下のコードで確認できると思います。
27
+ ```python
28
+ from flask import Flask, request
29
+
30
+ app = Flask(__name__)
31
+
32
+ if __name__ == '__main__':
33
+ app.run()
34
+
35
+
36
+ @app.post("/detect")
37
+ def detectio(): # これは同じ名前の関数が2個になってしまっていたので、1文字削りました。誤字ではないです。
38
+ ret = detection()
39
+ return ret
40
+
41
+
42
+ def load_image():
43
+ print('----')
44
+ filename = request.json["filename"]
45
+ print(filename)
46
+
47
+
48
+ def detection():
49
+ print("test")
50
+ load_image()
51
+
52
+
53
+ ```
54
+
55
+ curlが投げられる環境を作るのが面倒だったので、以下のHTTPリクエストを送信しました。
56
+ ```
57
+ POST http://localhost:5000/detect
58
+ Accept: application/json
59
+
60
+ {"filename": "xxx.jpg"}
61
+
62
+ ```
63
+
64
+ POSTでやる意味ないですが、念のため。
65
+
66
+ これを実行した結果は以下です。
67
+ ```text
68
+ test
69
+ ----
70
+ 127.0.0.1 - - [18/Nov/2022 19:08:21] "POST /detect HTTP/1.1" 400 -
71
+ ```
72
+
73
+ `reequest.json`は内部的に`get_json`を呼んでいるそうです。
74
+
75
+ [get_json](https://flask.palletsprojects.com/en/2.2.x/api/#flask.Request.get_json)
76
+
77
+ MIMEタイプがapplication/jsonでない、もしくはjsonの解析に失敗した場合、400を返すと書いてあるので、値が取れていないんじゃないかと思います。
78
+ PyCharmなどを使って、ブレークを設定し、requestに何が入っているのか確認してみるのが近道だと思います。
79
+ (私のやり方の場合は、request.dataにはデータが入っていました。)
80
+
81
+ また、Flaskで@appや@blueprintでデコレートされている関数は、有効な応答を返す必要があります。
82
+ 具体的には、detectのreturnを`return None`とかにして上げるとエラーが出て分かると思います。
83
+ ```text
84
+ TypeError: 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.
85
+ ```
86
+ エラーは上記の通りです。
87
+ returnには、stringか、dictか、listか、ヘッダかステータスを含むtupleか、Responseである必要があります。
88
+ `detection()`で何か返すか、`@app.post("/detect")`のreturnに`return 'OK'`とか返すか、とりあえず何か返してください。
89
+
90
+
91
+
92
+