2012-04-18 8 views
16

Estoy intentando crear una API simple en Flask, el primer paso es obtener los datos POST json. (Solo quiero imprimirlo por ahora) Este es mi código y cuando solicito/api con datos json, devuelve un error de 500. ¿Alguna idea de por qué esto está sucediendo?La solicitud Flask POST provoca un bloqueo del servidor

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

El comando 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" 
} 

Respuesta

24

En primer lugar lo que quiere hacer es habilitar el modo de depuración de modo frasco en realidad le dirá cuál es el error. (Y se obtiene el beneficio adicional de frasco de recarga cada vez que modifique su código!)

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

Entonces nos damos cuenta nuestro error:

TypeError: 'dict' object is not callable 

usted está volviendo request.json, que es una diccionario. Primero debe convertirlo en una cadena. Es bastante fácil de hacer:

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

¡Lo tienes! :)

+1

Ese modo de depuración me ahorró mucho tiempo: D –

+0

Son las otras configuraciones para la depuración, porque me parece que a pesar de tener la depuración establecida en True, no recibo los mensajes de error en la pantalla. – disruptive

+0

De hecho, me di cuenta de que todos los mensajes de error se enviaban a la terminal donde estaba ejecutando mi servidor. Sin embargo, el modo de depuración resultó útil para otras pruebas (e imprime justo donde ejecuta su comando curl) – alisa

Cuestiones relacionadas