我无法弄清楚在使用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()
答案 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"
}
]
}