Flask-RESTful を使って、REST APIを作る【Python Tips】

2018年12月3日月曜日

Flask Flask-RESTful Python

t f B! P L

Flask-RESTful を使って、REST APIを作る【Python Tips】

タイトル_Flask-RESTAfulで REST API作成

Flask + Flask-RESTful を使って、Pythonで REST APIを作ってみます。
前回 作成したREST APIを、Flask-RESTfulを使って書き直していきます。

インストール

Flaskと、Flask-RESTfulをインストールします。

$ pip install flask flask_restful

サンプルード

ユーザを、取得/登録/更新/削除する、REST APIのサンプルです。
HTTPメソッドによって、処理モードを振り分けています。

HTTP メソッド URL ペイロード 処理内容
GET /user?id=<USERID> なし ユーザを1件取得
POST /user/ ユーザ情報(JSON) ユーザの登録
PUT /user/ ユーザ情報(JSON) ユーザの更新
DELETE /user?id=<USERID> なし ユーザの削除

# coding: utf-8
from flask import Flask, abort, request
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

# テストデータ
users = [
    { "id": "U001", "name": "ユーザ太郎", "age": 27 },
    { "id": "U002", "name": "ユーザ二郎", "age": 20 },
    { "id": "U003", "name": "ユーザ三郎", "age": 10 }
]

class User(Resource):
    def get(self):
        """
        ユーザを1件取得する
        """
        id = request.args.get('id')
        result = [n for n in users if n["id"] == id]

        if len(result) >= 1: 
            # ユーザ情報を返却
            return result[0]
        else:
            # 存在しないユーザIDが指定された
            abort(404)

    def post(self):
        """
        ユーザを登録する
        """
        #ユーザを追加
        users.append(request.json)

        #正常に登録できたので、HTTP status=204(NO CONTENT)を返す
        return '', 204

    def put(self):
        """
        ユーザを更新する
        """
        user = request.json
        lst = [val for val in users if val["id"] == user["id"]]
        
        if len(lst) >= 1: 
            lst[0]["name"] = user["name"]
            lst[0]["age"] = user["age"]
        else:
            #存在しないユーザIDが指定された場合
            abort(404)

        #正常に更新できたので、HTTP status=204(NO CONTENT)を返す
        return '', 204

    def delete(self):
        """
        ユーザを削除する
        """
        id = request.args.get('id')
        lst = [i for i, val in enumerate(users) if val["id"] == id]
        for index in lst:
            del users[index]

        if len(lst) >= 1: 
            #ユーザの削除を行った場合、HTTP status=204(NO CONTENT)を返す
            return '', 204
        else:
            #存在しないユーザIDが指定された場合
            abort(404)

api.add_resource(User, '/user')

if __name__ == "__main__":
    app.run(debug=True)

上のサンプルのように、Flask-RESTfulでは、ユーザ情報・顧客情報などのリソース単位で Pythonのクラスを作成します。
クラスの中には、HTTP メソッドに対応する関数(get/post/put/delete)を定義して、必要な処理を実装します。

おわりに

Flask-RESTfulを使えば、クラスとリソースの関係が、1:1になるので、APIの数が増えていっても分かりやすい構造となり、メンテナンス性が向上すると思います。

さらに、HTTPのGETであれば get()関数を作るなど、メソッド名がフレームワーク側でルール決めされている為、人によって関数名がバラバラになる心配もなく、コードが標準化される所もいいですね。

関連記事

MacにPython3をインストールする! (サクッとインストールしたい人向け)

Mac環境に、Python3を簡単にインストールする方法を紹介しています。

Python3入門! 基礎をおさらい (変数/演算子/条件分岐/繰り返し)

1つの記事に、基本文法をまとめて書いているので、時間が空いて忘れてしまった場合でも、一気に復習出来るようになっています。よければ見てください。

Flaskでソースの変更を検知して、Webアプリを自動リロードする[Python Tips]

Flaskの開発で、ソースを更新したら、自動的にWebアプリをリロードする方法です。

Flaskで REST API開発する! 直ぐに実行できるサンプルコードで解説 【Python Tips】

Pythonの軽量Webフレームワークである、FlaskでREST APIを作るまでの流れを、紹介します。

Pythonで小数点の四捨五入/切り捨て/切り上げを行う

Pythonのdecimalモジュールを使って、小数点の丸めを行う方法です。

Pythonで正規表現を使って数値/英字チェックを実装する (コピペ用)

数値/半角英字などのチェック処理を、Pythonの正規表現を使って実装します。
コピペで簡単に使えるようになっています。

スポンサーリンク

QooQ