我正在学习 Backbone.js 和 Flask(以及 Flask-sqlalchemy)。我之所以选择 Flask,是因为我读到它与实现 RESTful 接口的 Backbone 配合得很好。我目前正在学习使用(或多或少)这种模型的课程:
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
我必须添加一个json_dump
方法才能将 JSON 发送到浏览器。否则,我会收到类似的错误object is not JSON serializable
,所以我的第一个问题是:
有没有更好的方法在 Flask 中进行序列化?似乎有些对象是可序列化的,而另一些则不是,但总的来说,它并不像我预期的那么容易。
一段时间后,我最终得到了以下视图来处理每种类型的请求:
@app.route('/tasks')
def tasks():
tasks = Tasks.query.all()
serialized = json.dumps([c.json_dump() for c in tasks])
return serialized
@app.route('/tasks/<id>', methods=['GET'])
def get_task(id):
tasks = Tasks.query.get(int(id))
serialized = json.dumps(tasks.json_dump())
return serialized
@app.route('/tasks/<id>', methods=['PUT'])
def put_task(id):
task = Tasks.query.get(int(id))
task.title = request.json['title']
task.completed = request.json['completed']
db.session.add(task)
db.session.commit()
serialized = json.dumps(task.json_dump())
return serialized
@app.route('/tasks/<id>', methods=['DELETE'])
def delete_task(id):
task = Tasks.query.get(int(id))
db.session.delete(task)
db.session.commit()
serialized = json.dumps(task.json_dump())
return serialized
@app.route('/tasks', methods=['POST'])
def post_task():
task = Tasks(request.json['title'], request.json['completed'])
db.session.add(task)
db.session.commit()
serialized = json.dumps(task.json_dump())
return serialized
在我看来,这似乎有点冗长。同样,实施它们的正确方法是什么?我在 Flask 中看到了一些提供 RESTful 接口的扩展,但这些对我来说看起来相当复杂。
谢谢