web-dev-qa-db-ja.com

Flask POSTリクエストによりサーバーがクラッシュします

私はFlaskで単純なapiを作成しようとしています。最初のステップは、POST jsonデータを取得することです。今は印刷したいだけです)これは私のコードで、/ apiを要求したときですjsonデータを使用すると、500エラーが返されます。これが発生している理由について何か考えはありますか?

from flask import Flask, request, Response
app = Flask(__name__)

@app.route('/')
def root_response():
    return "Hello World."

@app.route('/api', methods=['POST', 'GET'])
def api_response():
    if request.method == 'POST':
        return request.json

if __name__ == '__main__':
    app.run()

Curlコマンド:

$ curl -H "Content-Type: application/json" --data @body.json http://127.0.0.1:5000/api
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to complete your request.  Either the server is overloaded or there is an error in the application.</p>

body.json:

{
"please": "print",
"me": "now"
}
22
zallarak

最初に行うことは、デバッグモードを有効にすることです。Flaskは、実際にエラーが何であるかを教えてくれます。(そして、flaskコードを変更するとき!)

if __name__ == '__main__':
    app.debug = True
    app.run()

次に、エラーを見つけます。

TypeError: 'dict' object is not callable

辞書であるrequest.jsonを返しています。まず文字列に変換する必要があります。とても簡単です:

def api_response():
    from flask import jsonify
    if request.method == 'POST':
        return jsonify(**request.json)

ありました! :)

36
Theron Luhn

デフォルトのポート(5000)またはユーザーが明示的に指定したポート(eg:app.run(port = 7000))がバックグラウンドで他のプロセスを使用している可能性があるため、サーバーが過負荷になっているため、実行中のプロセスを強制終了する必要がありますそのポートで使用されます。

次のコマンドを使用して、そのポートを使用しているプロセスID(PIDS)を確認できます:netstat -o -ain command Prompt enter image description here *ポートのそれぞれのPIDを調べます

次に、次のコマンドを使用して、使用するポートのすべてのプロセス(PIDS)を強制終了します。Taskkill/PID 30832/Fここでは、PID 30832を使用しましたポート127.0.0.1:7000の場合、過負荷エラーが発生します。その後、問題は解決されます。

2