web-dev-qa-db-fra.com

Flask POST fait planter le serveur)

J'essaye de faire une simple API dans Flask, la première étape étant d'obtenir les données POST json. (Je veux juste l'imprimer pour l'instant) Ceci est mon code et quand je demande/api avec les données json, il renvoie une erreur 500. Des réflexions sur la raison pour laquelle cela se produit?

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()

La commande 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

Tout d'abord, ce que vous voulez faire est d'activer le mode de débogage pour que Flask vous indique réellement quelle est l'erreur. (Et vous obtenez l'avantage supplémentaire de flask en rechargeant chaque fois que vous modifiez votre code!)

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

Ensuite, nous découvrons notre erreur:

TypeError: 'dict' object is not callable

Vous retournez request.json, qui est un dictionnaire. Vous devez d'abord le convertir en chaîne. C'est assez simple à faire:

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

Te voilà! :)

36
Theron Luhn

Le serveur est surchargé car le port par défaut (5000) ou le port explicitement mentionné par un utilisateur (par exemple: app.run (port = 7000)) peut utiliser d'autres processus en arrière-plan, nous devons donc tuer les processus en cours utilisé par ce port.

Vous pouvez voir les identifiants de processus (PIDS) qui utilisent ce port en utilisant la commande suivante: netstat -o -a dans l'invite de commandes enter image description here * Regardez dans le PID respectif pour le port

Ensuite, tuez tous les processus (PIDS) pour le port que vous souhaitez utiliser à l'aide de la commande suivante: Taskkill/PID 30832/F Ici, j'ai utilisé le PID 30832 pour le port 127.0.0.1:7000 qui donne l'erreur surchargée. Une fois ce problème résolu.

2
Sykam Sreekar Reddy