前回は、Flask-SQLAlchemyを利用して、ToDoリストのデータをデータベースに保存するコードを書いた。今回は、ToDoリストの取得/追加などを行うAPIを作成してみよう。APIが返送するJSONデータの仕様を一緒にすればよかったのだが、ちゃんと設計しなかったため、互換性がない)。3.6.5を利用している。基本方針ToDoリストAPIの基本方針としては、次のようになる。/api/todoitems/<int:item_id>:指定項目のdone状態の反転GET/POST/DELETE/PUTにより、データベースに対するToDoリスト項目の取得/作成/削除/状態変更を行う。APIが返送するデータ例、次の画像例は後者が返送するデータ例)。APIとしてJSONデータをクライアントに送信するには、さらに別の拡張機能を使った方が簡単になる。最初の例では、「Flask-Marshmallow」拡張機能を使用して、データベースに保存されたデータのシリアライズ/デシリアライズを行う。API化をより簡単に行える「Flask-Restless」拡張機能を使ってみよう。flask-marshmallow」コマンドを実行してFlaskとそこで利用する拡張機能をインストールした仮想環境を作成している。Flask-Marshmallowは、オブジェクトのシリアライズ/デシリアライズを行う「marshmallow」のFlask用ラッパーだ。大ざっぱには次のような手順でJSON化されたデータをクライアントに返送する。前回は、todo.pyファイルでデータベースモデルとなるToDoItemクラスと、それを操作するインタフェースとしてToDoListクラスを定義していたが、今回はソースコードがシンプルになるように、ToDoListクラスで行っていた操作をapp.pyのビュー関数に移行している。全体としてのプロジェクト構成は次のようになる。Flask-Marshmallowを利用したプロジェクトの構成そのため、上の手順の1.の内容がtodo.pyファイルに、2.の内容がapp.pyファイルにまとまるようになっている。以下ではそれらを順番に見ていこう。データベースモデルから出力スキーマ情報を持つクラスを定義データベース操作をまとめたtodo.pyファイルの内容は次のようになっている。ItemSchema(many=True)Flask-Marshmallowを利用して、データベースの出力形式を指定(todo.pyファイル)Flask-MarshmallowパッケージからMarshmallowクラスをインポートして、そのインスタンスを作成し、appオブジェクトでその初期化を行うという流れは前回のFlask-SQLAlchemyの利用パターンと同じだ(強調書体の部分)。ToDoItemクラスは前回も見た通りのものだ。"done")」の部分)。item_schema/items_schemaはこのスキーマ定義クラスのインスタンスであり、それぞれ単一データ/複数データをJSON化する際に使用する。ItemSchemaクラスにはjsonifyメソッドがあるので、データベースから取得したデータを「item_schema.jsonify(somedata)」のようにしてJSON化できる。後は、そのデータをビュー関数でクライアントに返送すればよい。データベースから取得したデータをJSON化して返送リクエストを受け取り、データベースにアクセスし、クライアントに結果を返送する関数群は前回までと同様にapp.pyファイルに記述した。item_schema.jsonify(item)クライアントからのリクエストを受け取る関数群(app.pyファイル)Flaskアプリのインスタンスを作成して、それをinit_db/init_schema関数に渡して、SQLAlchemy/Marshmallowオブジェクトの初期化を行った後は、クライアントからのリクエストを処理するコードが続いている。各関数は典型的なFlaskアプリのビュー関数となっているが、全てのビュー関数の@app.routeデコレータには受け付けるHTTPメソッドが明記されていることに注意されたい。幾つかの関数を例に説明をしておこう。全項目の取得を行うget_todosメソッドは次のようになっている。items_schema.jsonify(items)全項目を取得するget_todoitems関数@app.routeデコレータでは、リクエストのURLとHTTPメソッドが本稿冒頭で述べたように指定されている。クライアントに返送されるデータはitems_schema.jsonifyメソッドでJSON化しているが、ここでは複数のToDo項目を返送するので「ItemSchema(many=True)」としてインスタンス化したitems_schemaオブジェクトを使用している。指定したitem_idの項目を取り出すget_todoitem関数は次のようになっている。item_schema.jsonify(item)指定したitem_idの項目を取り出すget_todoitem関数ここで注目したいのは「first_or_404メソッド」だ。Found」を返してくれる。ここでは取得する項目は1つだけなので、item_schemaオブジェクトを使ってJSON化を行っている。新規項目を登録するregister_todoitem関数は次のようになっている。基本構造はget_todoitems関数と同様だが、こちらは受け取ったデータ(request.jsonオブジェクト)に、"title"をキーとする要素が含まれているかをチェックして、それがある場合にだけ新規にデータを作成するようにしている。いったところが、app.pyファイルで重要な部分だ。APIの動作を確認しておこう。run」コマンドを実行してアプリを起動し、curlコマンドでその動作を確認してみよう。新規に項目を作成するなら次のようになる。game」というToDo項目を追加また、全項目の取得なら次のようになる。以下はPOSTリクエストで幾つかの項目を作成して、最後にGETリクエストで全項目を取得しているところだ。run」コマンドを実行しアプリを起動した後に、[ターミナルの分割]ボタンをクリックして、1つのターミナルウィンドウにアプリからのメッセージとコマンドプロンプトを表示するようにしている。APIがどう反応しているかを左側のペーンで確認できる。APIを作成する方法を見てきた。APIを作成してみよう。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。