Json Flask中的RESTful接口和序列化问题

Json Flask中的RESTful接口和序列化问题,json,rest,serialization,flask,flask-sqlalchemy,Json,Rest,Serialization,Flask,Flask Sqlalchemy,我正在学习Backbone.js和Flask(以及Flask-sqlalchemy)。我选择Flask是因为我读到它与实现RESTful接口的主干网配合得很好。我目前正在遵循一种使用(或多或少)这种模式的方法: class Tasks(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), unique=True) completed = db.Col

我正在学习Backbone.js和Flask(以及Flask-sqlalchemy)。我选择Flask是因为我读到它与实现RESTful接口的主干网配合得很好。我目前正在遵循一种使用(或多或少)这种模式的方法:

class Tasks(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), unique=True)
    completed = db.Column(db.Boolean, unique=False, default=False)

    def __init__(self, title, completed):
        self.title = title
        self.completed = completed

    def json_dump(self):
        return dict(title=self.title, completed=self.completed)

    def __repr__(self):
        return '<Task %r>' % self.title
在我看来,这似乎有点冗长。再说一次,实施它们的正确方式是什么?我见过一些在Flask中提供RESTful接口的软件,但在我看来这些软件相当复杂


感谢

Flask提供了
jsonify
函数来完成此操作。看看它的工作原理

您的json_dump方法是正确的,尽管代码可以变得简洁。请参阅此代码段

@app.route('/tasks')
def tasks():
    tasks = Tasks.query.all()
    return jsonify(data=[c.json_dump() for c in tasks])

老实说,我会用一个模块来做这件事。我们在一些API中使用了Flask Untivent,您可以看看:

但是,如果您想构建自己的对象,可以使用SQLAlchemy的内省将对象作为键/值对输出

类似这样的,虽然我总是要进行三重检查,但我的语法是正确的,所以将此作为指导,而不是工作代码

@app.route('/tasks')
def tasks():
    tasks = Tasks.query.all()

    output = []
    for task in tasks:
      row = {}

      for field in Tasks.__table__.c:
        row[str(field)] = getattr(task, field, None)

      output.append(row)

    return jsonify(data=output)
我发现这个问题可能对你更有帮助。我熟悉SQLAlchemy 0.7,看起来0.8添加了一些更好的内省技术:


但仅适用于某些对象。在这种情况下,它不能“开箱即用”。看这个。提议的解决方案太复杂了。很抱歉反应太晚。是的,我想你提到的项目和我想的是一样的。顺便说一下,我正在使用sqlalchemy,所以我不知道如何理解sqlalchemy的内省。我想我可以使用第一个选项,但我期待着其他的东西。它肯定不适合神经质的人,但它很强大。您可以将这个方法用于Flask SQLAlchemy,事实上,我在这里给出的示例使用Flask SQLAlchemy。我已经在我们的应用程序中使用它来进行自定义数据提取和其他深层魔法。很好,我将尝试实现它。您知道这些内置方法除了管理请求和设置路由之外是否还有其他作用,或者基本上就是这些。例如,使用内省序列化模型的示例:
@app.route('/tasks')
def tasks():
    tasks = Tasks.query.all()

    output = []
    for task in tasks:
      row = {}

      for field in Tasks.__table__.c:
        row[str(field)] = getattr(task, field, None)

      output.append(row)

    return jsonify(data=output)