¿Cómo obtener POSTED JSON en el matraz?

Estoy tratando de construir una API simple usando Flask, en la que ahora quiero leer un poco de JSON POST. Hago la publicación con la extensión PostMan Chrome , y la publicación JSON I es simplemente {"text":"lalala"} . Intento leer el JSON usando el siguiente método:

 @app.route('/api/add_message/', methods=['GET', 'POST']) def add_message(uuid): content = request.json print content return uuid 

En el navegador, devuelve correctamente el uuid que puse en el GET, pero en la consola, simplemente imprime None (donde espero que imprima el {"text":"lalala"} . ¿Alguien sabe cómo puedo obtenerlo? ¿El JSON publicado desde dentro del método Flask?

En primer lugar, el atributo .json ha quedado en desuso, debe usar el método request.get_json() .

.json configurar el tipo de contenido de application/json en application/json para que la propiedad .get_json() y el método .get_json() funcionen; tampoco producen None contrario. Ver la documentación de la Request del matraz :

Esto contendrá los datos JSON analizados si el mimetype indica JSON ( application / json , vea is_json() ), de lo contrario, será None .

Puede indicar a request.get_json() que omita el requisito de tipo de contenido estableciendo force=True .

Tenga en cuenta que si se produce una excepción en este punto (lo que posiblemente resulte en una respuesta de 400 Solicitudes incorrectas), sus datos JSON no serán válidos. De alguna manera está malformado; es posible que desee comprobarlo con un validador JSON.

Para referencia, aquí hay un código completo sobre cómo enviar json desde un cliente de Python:

 import requests res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"}) if res.ok: print res.json() 

La entrada “json =” establecerá automáticamente el tipo de contenido, como se explica aquí: Publicar JSON usando Python Requests

Y el cliente anterior trabajará con este código del lado del servidor:

 from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/api/add_message/', methods=['GET', 'POST']) def add_message(uuid): content = request.json print content['mytext'] return jsonify({"uuid":uuid}) if __name__ == '__main__': app.run(host= '0.0.0.0',debug=True) 

Esta es la forma en que lo haría y debería ser

 @app.route('/api/add_message/', methods=['GET', 'POST']) def add_message(uuid): content = request.get_json(silent=True) # print(content) # Do your processing return uuid 

Con silent=True set, la función get_json fallará de forma silenciosa al intentar recuperar el cuerpo de json. De forma predeterminada, se establece en False .

Configuración de force=True ignorará el request.headers.get('Content-Type') == 'application/json' verifica que el matraz lo haga por ti. Por defecto, esto también se establece en False .

Ver documentación del matraz .

Recomiendo encarecidamente dejar force=False y hacer que el cliente envíe el encabezado Content-Type para hacerlo más explícito.

¡Espero que esto ayude!

Esta solución funciona:

 from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/hello', methods=['POST']) def hello(): return jsonify(request.json)