5

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_dumpJSON をブラウザーに送信するには、メソッドを追加する必要がありました。そうしないと、次のようなエラーが発生する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 インターフェイスを提供するいくつかの拡張機能を見てきましたが、それらは非常に複雑に見えます。

ありがとう

4

2 に答える 2

8

正直なところ、これを行うにはモジュールを使用します。一部の API には Flask-Restless を使用しています。

https://flask-restless.readthedocs.org/en/latest/

ただし、独自にビルドする場合は、SQLAlchemy のイントロスペクションを使用して、オブジェクトをキーと値のペアとして出力できます。

http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#metadata-reflection

このようなもので、構文が正しいことを常にトリプルチェックする必要がありますが、これは実際のコードよりもガイドとして使用してください。

@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 イントロスペクション

于 2012-11-25T19:56:28.410 に答える
-1

Flask はjsonifyこれを行う機能を提供します。ここで動作を確認してください。

コードは簡潔にすることができますが、あなたの json_dump メソッドは正しいです。このコード スニペットを参照してください

@app.route('/tasks')
def tasks():
    tasks = Tasks.query.all()
    return jsonify(data=[c.json_dump() for c in tasks])
于 2012-11-24T19:49:45.900 に答える