在Flask中使用json返回数据库信息

时间:2016-11-02 04:59:31

标签: python json flask

我无法弄清楚在使用GET方法时如何从我的数据库返回信息,因为我在return语句中不断出现错误。我不断收到像对象不可订阅或与dicts有关的错误。

我试过了。

return jsonify({'developers': User.query.all()})

我收到错误TypeError:< main .User对象位于0x038FC9D0>不是JSON可序列化的

当我尝试

return json.dumps(tuple[User.query.all()])

我收到错误。 TypeError:'type'对象不可订阅

from flask import Flask, jsonify,json
from flask_sqlalchemy import SQLAlchemy


app = Flask(__name__)
app.config.from_pyfile('Config.py')
db = SQLAlchemy(app)

class User(db.Model):
    User_ID = db.Column(db.Integer, primary_key = True)
    firstName = db.Column(db.String(20))
    lastName = db.Column(db.String(20))


   def __init__(self,firstName, lastName):
       self.firstName = firstName
       self.lastName = lastName
       db.create_all()

@app.route('/', methods = ['GET'])
def index():
    return json.dumps(tuple[User.query.all()])

if __name__ == '__main__':
    app.run()

1 个答案:

答案 0 :(得分:1)

有几个问题。首先,SQLAlchemy db.Model类型不是json可序列化的。当您尝试将tuple[...]用作另一个错误时,这一事实就会被掩盖,但即使您将其修复为tuple(...),您也会回到原始问题。

这应该可行,使用json序列化的mixin。我认为这仍然会遇到datetime对象的问题,但您可以修改as_dict方法来处理它。

class JsonModel(object):
    def as_dict(self):
       return {c.name: getattr(self, c.name) for c in self.__table__.columns}

class User(db.Model, JsonModel):
    User_ID = db.Column(db.Integer, primary_key = True)
    firstName = db.Column(db.String(20))
    lastName = db.Column(db.String(20))


    def __init__(self,firstName, lastName):
       self.firstName = firstName
       self.lastName = lastName
       db.create_all()

@app.route('/', methods = ['GET'])
def index():
    return json.dumps([u.as_dict() for u in User.query.all()])

<强>提示:

  • 在开发过程中启用app.debug = True也是一个好主意。
  • 在你的初始化中运行db.create_all可能是一个坏主意。
  • 使用jsonify很好,因为它也处理Content-Type标头。
> kurl -i http://localhost:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 102
Server: Werkzeug/0.8.3 Python/2.7.10
Date: Wed, 02 Nov 2016 05:28:42 GMT

{
  "users": [
    {
      "lastName": "Berry",
      "User_ID": 1,
      "firstName": "Sean"
    }
  ]
}