🐥
Python FlaskでRESTful APIを作成してみた
はじめに
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