Python FlaskでRESTful APIを作成してみる

# Python FlaskでRESTful APIを作成してみた

Flaskを使用して簡単なRESTful APIを作成する方法について説明します。

## 0. Flaskとは
Flaskとは、Pythonのための軽量なウェブアプリケーションフレームワークです。
Pythonで用いられるフレームワークとしてはDjangoも人気ですが、
簡単なLINEボットやスマートスピーカーのアプリなど、小規模〜中規模のWebアプリケーションであれば、Flaskで作成するのができるのでオススメです。

## 1. 作業の手順

### 1.1. Flaskのインストール

まず、Flaskをインストールします。以下のコマンドをターミナルで実行してください。

```sh
pip install flask
```


### 1.2. ディレクトリ構造の準備
プロジェクトのディレクトリ構造を以下のように準備します。

```
my_flask_app/
│
├── app.py
└── requirements.txt
```

### 1.3. Flaskアプリケーションの作成
app.pyファイルを以下の内容で作成します。

```python
from flask import Flask, jsonify, request

app = Flask(__name__)

# サンプルデータ
books = [
    {'id': 1, 'title': '1984', 'author': 'George Orwell'},
    {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}
]

# 全ての本を取得
@app.route('/api/books', methods=['GET'])
def get_books():
    return jsonify({'books': books})

# 特定の本を取得
@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is None:
        return jsonify({'error': 'Book not found'}), 404
    return jsonify(book)

# 新しい本を追加
@app.route('/api/books', methods=['POST'])
def add_book():
    new_book = request.get_json()
    new_book['id'] = books[-1]['id'] + 1 if books else 1
    books.append(new_book)
    return jsonify(new_book), 201

# 本を更新
@app.route('/api/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is None:
        return jsonify({'error': 'Book not found'}), 404
    updated_data = request.get_json()
    book.update(updated_data)
    return jsonify(book)

# 本を削除
@app.route('/api/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [book for book in books if book['id'] != book_id]
    return '', 204

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

## 2. サンプルコードの説明

### 2.1. インポートとアプリケーションの初期化
```python
from flask import Flask, jsonify, request

app = Flask(__name__)
```
Flaskモジュールをインポートし、アプリケーションを初期化します。


### 2.2. サンプルデータ
```python
books = [
    {'id': 1, 'title': '1984', 'author': 'George Orwell'},
    {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}
]
```
サンプルデータとして、2冊の本の情報を用意します。


### 2.3. エンドポイントの定義
**すべての本を取得**
```python

@app.route('/api/books', methods=['GET'])
def get_books():
    return jsonify({'books': books})
```
GETリクエストに対してすべての本の情報を返します。

**特定の本を取得**

```python
@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is None:
        return jsonify({'error': 'Book not found'}), 404
    return jsonify(book)
```
指定されたIDの本を取得します。

**新しい本を追加**
```python
@app.route('/api/books', methods=['POST'])
def add_book():
    new_book = request.get_json()
    new_book['id'] = books[-1]['id'] + 1 if books else 1
    books.append(new_book)
    return jsonify(new_book), 201
```
POSTリクエストで新しい本を追加します。


**本を更新**

```python
@app.route('/api/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
    book = next((book for book in books if book['id'] == book_id), None)
    if book is None:
        return jsonify({'error': 'Book not found'}), 404
    updated_data = request.get_json()
    book.update(updated_data)
    return jsonify(book)
```
指定されたIDの本の情報を更新します。

**本を削除**

```python
コードをコピーする
@app.route('/api/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
    global books
    books = [book for book in books if book['id'] != book_id]
    return '', 204
```
指定されたIDの本を削除します。

## 3. 動かし方

### 3.1. ディレクトリに移動
ターミナルでプロジェクトのディレクトリに移動します。

```sh
cd /path/to/my_flask_app
```
対象のapp.pyがあるところまで移動すれば良いです。環境によって変わることがあるので。

### 3.2. アプリケーションの実行
以下のコマンドでFlaskアプリケーションを実行します。

```sh
python app.py
```

### 3.3. APIのテスト
ブラウザまたはcURLを使用してAPIをテストします。

**すべての本を取得**
```sh
curl http://127.0.0.1:5000/api/books
```

**特定の本を取得**
```sh
curl http://127.0.0.1:5000/api/books/1
```

**新しい本を追加**
```sh
curl -X POST -H "Content-Type: application/json" -d '{"title": "New Book", "author": "New Author"}' http://127.0.0.1:5000/api/books
```

**本を更新**
```sh
curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated Book"}' http://127.0.0.1:5000/api/books/1
```

**本を削除**
```sh
curl -X DELETE http://127.0.0.1:5000/api/books/1
```

以上が、Flaskを使用して簡単なRESTful APIを作成する手順です。
必要に応じて機能を拡張していってください。