【问题标题】:How to return data from a MySQL query in a Flask app?如何从 Flask 应用程序中的 MySQL 查询返回数据?
【发布时间】:2014-03-09 17:16:07
【问题描述】:

我有以下代码:

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: No module named JSONEncoder

【问题讨论】:

  • cur.fetchall() 返回一个元组列表。
  • 我试图获得可以在 Angular 客户端上使用的 JSON 结果。有可能吗?
  • 您无法更改 fetchall 返回的内容,但应该可以将其解析为适当的格式。
  • @JayanthKoushik 我现在使用 simplejson 进行序列化。但我收到以下错误 TypeError: datetime.date(2013, 12, 1) is not JSON serializable。你能帮帮我吗?

标签: python mysql flask


【解决方案1】:

使用Flask内置的jsonify函数,因为它是already extended to work with dates

from Flask import jsonify

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

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

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

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 和datetimes。

【讨论】:

  • 谢谢@SeanVieira,但错误保持不变:-(
  • 我可以保留这段代码吗? import flask as fk from flask import jsonify import MySQLdb as mdb app = fk.Flask(name) app.debug = True
  • @Hugo - 是的,当然 - 我只输入了改变的部分:-)
  • 再次感谢。但错误保持不变:-(
  • 我必须创建一个特定的日期时间解析器吗?
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 2016-03-11
  • 2018-10-10
  • 2018-08-28
  • 2014-10-16
  • 2016-12-19
  • 2020-09-23
  • 1970-01-01
相关资源
最近更新 更多