一尘不染

如何从Flask应用中的MySQL查询返回数据?

flask

我有以下代码:

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()

返回的错误是:ImportError:没有名为JSONEncoder的模块


阅读 953

收藏
2020-04-07

共1个答案

一尘不染

使用Flask的内置jsonify函数,因为它已经扩展为可以使用日期:

from Flask import jsonify

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

数据将通过一个data包含行数组的单键()作为对象fetchall返回(根据行返回的形式将其表示为数组或对象)。

如果需要序列化更多类型(例如,要返回date而不是datetime实例),则需要json_encoder用JSONEncoder知道如何处理类型的子类覆盖Flask的属性:

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

然后可以在Flask实例上设置它:

app.json_encoder = SpecializedJSONEncoder

现在,你将能够同时处理dates和datetime。

2020-04-07