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
.