🐥

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

2024/10/17に公開

はじめに

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

0. Flaskとは

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

1. 作業の手順

1.1. Flaskのインストール

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

pip install flask

1.2. ディレクトリ構造の準備

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

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

1.3. Flaskアプリケーションの作成

app.pyファイルを以下の内容で作成します。

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. インポートとアプリケーションの初期化

from flask import Flask, jsonify, request

app = Flask(__name__)

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

2.2. サンプルデータ

books = [
    {'id': 1, 'title': '1984', 'author': 'George Orwell'},
    {'id': 2, 'title': 'To Kill a Mockingbird', 'author': 'Harper Lee'}
]

サンプルデータとして、2冊の本の情報を用意します。

2.3. エンドポイントの定義

すべての本を取得


@app.route('/api/books', methods=['GET'])
def get_books():
    return jsonify({'books': books})

GETリクエストに対してすべての本の情報を返します。

特定の本を取得

@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の本を取得します。

新しい本を追加

@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リクエストで新しい本を追加します。

本を更新

@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の本の情報を更新します。

本を削除

コードをコピーする
@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. ディレクトリに移動

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

cd /path/to/my_flask_app

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

3.2. アプリケーションの実行

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

python app.py

3.3. APIのテスト

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

すべての本を取得

curl http://127.0.0.1:5000/api/books

特定の本を取得

curl http://127.0.0.1:5000/api/books/1

新しい本を追加

curl -X POST -H "Content-Type: application/json" -d '{"title": "New Book", "author": "New Author"}' http://127.0.0.1:5000/api/books

本を更新

curl -X PUT -H "Content-Type: application/json" -d '{"title": "Updated Book"}' http://127.0.0.1:5000/api/books/1

本を削除

curl -X DELETE http://127.0.0.1:5000/api/books/1

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

Discussion