Cómo publicar json en Frasco?


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

@app.route('/api/add_message/<uuid>', 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, solo imprime None (donde espero que imprima el {"text":"lalala"}. ¿Alguien sabe cómo puedo obtener el JSON publicado desde el método Flask?

Author: Martijn Pieters, 2013-11-15

4 answers

Debe establecer el tipo de contenido de la solicitud en application/json para que la propiedad .json funcione; de lo contrario, será None. Véase la documentación del matraz Request :

Si el tipo mime es application/json este contendrá los datos JSON analizados. De lo contrario esto será None.

Matraz 0.10 añadió el request.get_json() método , y debe usar ese método en lugar de la propiedad .json. Puede indicarle al método que omita el requisito de tipo de contenido configurando force=True.

Tenga en cuenta que si se genera una excepción en este punto (lo que posiblemente resulte en una respuesta de solicitud incorrecta de 400), sus datos JSON no son válidos. Es de alguna manera malformado; es posible que desee comprobar con un validador JSON.

 264
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-05 12:25:39

Como referencia, aquí está el código completo para cómo enviar json desde un cliente 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 peticiones Python

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

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

@app.route('/api/add_message/<uuid>', 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)
 45
Author: Luke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:48

Esta es la forma en que lo haría y debería ser {[10]]}

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

Con silent=True establecido, la función get_json fallará silenciosamente al intentar recuperar el cuerpo json. Por defecto se establece en False. El ajuste force=True ignorará el control request.headers.get('Content-Type') == 'application/json' que el matraz hace por usted. De forma predeterminada, también se establece en False. Véase la 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 ayuda!

 42
Author: radtek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-27 22:11:47

Esta solución funciona:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['POST'])
def hello():
   return jsonify(request.json)
 5
Author: trojek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-28 15:40:43