¿Cómo devolver datos de una consulta MySQL en una aplicación Flask?

Tengo el siguiente código:

import flask as fk import MySQLdb import JSONEncoder class SpecializedJSONEncoder(JSONEncoder): def default(o): if isinstance(o, date): return date.strftime("%Y-%m-%d") else: super(SpecializedJSONEncoder, self).default(o) app = fk.Flask(__name__) app.json_encoder = SpecializedJSONEncoder app.debug = True @app.route("/") def home(): return "Hello world" @app.route("/temp") def temp(): db = MySQLdb.connect("localhost", "root", "","test") cur = db.cursor() query = "SELECT DATE(DTM), POM, ROUND(MIN(TMP),1) FROM dados_meteo WHERE POM = %s AND DATE(DTM) >= %s AND DATE(DTM) <= %s" param = ("Faro", "2013-12-01", "2013-12-05") cur.execute(query, param) data = cur.fetchall() return data.json_encoder() if __name__ == "__main__": app.run() 

El error devuelto es: ImportError: no hay un módulo llamado JSONEncoder

Utilice la función jsonify incorporada de jsonify , ya que ya está extendida para trabajar con fechas :

 from Flask import jsonify @app.route('/temp') def temp(): # Load database results # and then ... return jsonify(data=cur.fetchall()) 

Los datos se devolverán como un objeto con una sola clave ( data ) que contiene una matriz de filas (que se representarán como matrices u objetos en función de la forma en que fetchall devuelva filas).

Si necesita serializar más tipos (como en su caso, está obteniendo una date lugar de las instancias de date y datetime , deberá anular la propiedad json_encoder de Flask con una subclase de JSONEncoder que sabe cómo manejar sus tipos:

 class SpecializedJSONEncoder(JSONEncoder): def default(o): if isinstance(o, date): return date.strftime("%Y-%m-%d") else: super(SpecializedJSONEncoder, self).default(o) 

Y luego puedes configurarlo en tu instancia de Flask :

 app.json_encoder = SpecializedJSONEncoder 

Ahora podrá manejar las date y las date .