Devuelve la respuesta JSON desde la vista de Flask

Tengo una función que analiza un archivo CSV con Pandas y produce un dict con información resumida. Quiero devolver los resultados como una respuesta de una vista de Flask. ¿Cómo devuelvo una respuesta JSON?

@app.route("/summary") def summary(): d = make_summary() # send it back as json 

Pase los datos de resumen a la función jsonify , que devuelve una respuesta JSON.

 from flask import jsonify @app.route('/summary') def summary(): d = make_summary() return jsonify(d) 

A partir del Flask 0.11, puede pasar cualquier tipo serializable JSON, no solo dict, como el objeto de nivel superior.

jsonify serializa los datos que le pasas a JSON. Si quiere serializar los datos usted mismo, haga lo que jsonify construyendo una respuesta con status=200 y mimetype='application/json' .

 from flask import json @app.route('/summary') def summary(): data = make_summary() response = app.response_class( response=json.dumps(data), status=200, mimetype='application/json' ) return response 

Pase los argumentos de palabras clave a flask.jsonify y se mostrarán como un objeto JSON.

 @app.route('/_get_current_user') def get_current_user(): return jsonify( username=g.user.username, email=g.user.email, id=g.user.id ) 
 { "username": "admin", "email": "admin@localhost", "id": 42 } 

Si no desea utilizar jsonify por alguna razón, puede hacer lo que hace manualmente. Llame a flask.json.dumps para crear datos JSON, luego devuelva una respuesta con el tipo de contenido application/json .

 from flask import json @app.route('/summary') def summary(): data = make_summary() response = app.response_class( response=json.dumps(data), mimetype='application/json' ) return response 

Si desea analizar un archivo cargado por el usuario, el inicio rápido de Flask muestra cómo obtener archivos de los usuarios y acceder a ellos. Obtenga el archivo de request.files y páselo a la función de resumen.

 from flask import request, jsonify from werkzeug import secure_filename @app.route('/summary', methods=['GET', 'POST']) def summary(): if request.method == 'POST': csv = request.files['data'] return jsonify( summary=make_summary(csv), csv_name=secure_filename(csv.filename) ) return render_template('submit_data.html') 

Reemplace la clave 'data' de request.files con el nombre del archivo ingresado en su formulario HTML.

Puede escribir un decorador para convertir el valor de retorno de una función de vista en una respuesta JSON.

 def return_json(view): @functools.wraps(view) def wrapped_view(**values): return jsonify(view(**values)) return wrapped_view @app.route('/test/') @return_json def test(arg): if arg == 'list': return [1, 2, 3] elif arg == 'dict': return {'a': 1, 'b': 2} elif arg == 'bool': return True return 'non of them' 

Antes de Flask 0.11, jsonfiy no permitía devolver una matriz directamente. En su lugar, pase la lista como un argumento de palabra clave.

 @app.route('/get_records') def get_records(): results = [ { "rec_create_date": "12 Jun 2016", "rec_dietary_info": "nothing", "rec_dob": "01 Apr 1988", "rec_first_name": "New", "rec_last_name": "Guy", }, { "rec_create_date": "1 Apr 2016", "rec_dietary_info": "Nut allergy", "rec_dob": "01 Feb 1988", "rec_first_name": "Old", "rec_last_name": "Guy", }, ] return jsonify(results=list) 

Si necesita devolver una respuesta json para implementar una API de descanso, puede usar flask-restful ( https://flask-restful.readthedocs.io/en/latest/quickstart.html ). Creo que esta solución es más simple, más resistente y, de alguna manera, más elegante.

Aquí está su comienzo rápido:

 from flask import Flask from flask_restful import Resource, Api app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == '__main__': app.run(debug=True) 

Como dije anteriormente, jsonify es la mejor manera o también podría usar el paquete Flask- answers en https://github.com/Parkayun/flask-responses

 @app.route("/json") def hello(): return json_response(your_dict, status_code=201) 

Puedes probar este enfoque:

 from flask import jsonify, Flask app = Flask(__name__) @app.route("/summary") def summary(): d = make_summary() return jsonify(d)