Python: REST APIの作成
PythonのFlaskでREST APIを構築するためのステップバイステップガイド
👋 Stackhero ドキュメントへようこそ!
Stackhero は、デプロイ作業を効率化するために設計された、すぐに使える Python クラウド ソリューションを提供しています:
- シンプルな
git pushだけで、数秒でアプリケーションを本番環境にデプロイできます。- ご自身のドメイン名を利用可能で、HTTPS 証明書の自動設定により安全な接続も自動で管理されます。
- 自動バックアップ、ワンクリックアップデート、予測可能な料金体系により、インフラ管理ではなくコードに集中できます。
- プライベートかつ専用インフラ上で、強力なパフォーマンスとセキュリティを実現。お客様の環境は分離され、保護されています。
時間を節約し、ワークフローをシンプルに:Stackhero の Python クラウドホスティング なら、わずか 5分でコードを稼働させることができます。
このガイドでは、PythonとFlaskを使ってシンプルなREST APIを作成する方法を解説します。Flaskは軽量なマイクロフレームワークで、WebアプリケーションやAPIを迅速に構築するのに最適です。
前提条件
始める前に、以下のツールがインストールされていることを確認してください:
- Python
- pip
- git
- asdf
環境構築のサポートが必要な場合は、Development platformガイドをご参照ください。また、オンラインのCode-Heroプラットフォームを使えば、すぐにコーディングを始めることも可能です。Code-HeroはオンラインIDEとターミナルを提供しており、必要なツールがすべて事前にインストールされています。これにより、インストールやセットアップに煩わされることなく、コードに集中できます。
Python REST API running in Code-Hero, accessible directly from the browser
新しいプロジェクトの作成
まず、新しいプロジェクトディレクトリを作成します。この例では、プロジェクト名はmyRestApiです:
mkdir myRestApi
cd myRestApi
asdfで最新のPythonバージョンを設定し、Gitリポジトリを初期化します:
asdf install python latest \
&& asdf local python latest
echo "__pycache__/" >> .gitignore
git init
git add -A .
git commit -m "First commit"
Flask依存パッケージのインストール
この例で必要な主な依存パッケージはFlaskのみです。
Flaskはシンプルかつ高速に設計されており、余計なオーバーヘッドなしでWeb APIを構築・デプロイできます。ルーティング、テンプレート、HTTPリクエスト処理などの機能が標準で備わっているため、アイデアから動作するAPIまでを短時間で実現できます。
Flaskとpython-dotenvはpipでインストールできます:
pip install Flask python-dotenv
python-dotenvは環境変数を安全かつ便利に管理するために含めています。後のステップでその使い方を説明します。
インストール後、依存パッケージをrequirements.txtファイルに固定します:
pip freeze > requirements.txt
依存パッケージを固定することで、全員が同じバージョンを利用できるようになります。この小さな手間が、後々のトラブルシューティングの時間を大幅に削減します。
Flaskを使ったREST APIの実装
ここからAPIコードを書いていきます。
app.pyというファイルを作成し、以下のコードを追加してください:
import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request
# 本番環境以外では.envから環境変数を読み込む
if os.environ.get('ENV') != 'production':
load_dotenv()
app = Flask(__name__)
# タスクのサンプルデータ
tasks = [
{
'id': 1,
'title': 'Buy groceries',
'description': 'Milk, Cheese, Pizza, Fruits',
'done': False
},
{
'id': 2,
'title': 'Learn Python',
'description': 'Learn Python programming basics',
'done': False
}
]
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = [task for task in tasks if task['id'] == task_id]
if not task:
return jsonify({'error': 'Task not found'}), 404
return jsonify({'task': task[0]})
@app.route('/api/tasks', methods=['POST'])
def create_task():
if not request.json or 'title' not in request.json:
return jsonify({'error': 'Title is required'}), 400
task = {
'id': tasks[-1]['id'] + 1,
'title': request.json['title'],
'description': request.json.get('description', ""),
'done': False
}
tasks.append(task)
return jsonify({'task': task}), 201
if __name__ == '__main__':
if os.environ.get('ENV') == 'production':
app.run()
else:
app.run(host='0.0.0.0', port=8080, debug=True)
サーバーは次のコマンドで起動できます:
python app.py
host='0.0.0.0'を指定することで、Code-Hero利用時にブラウザからAPIへアクセスできます。http://<XXXXXX>.stackhero-network.com:8080/api/tasksにアクセスし、<XXXXXX>はご自身のCode-Heroドメインに置き換えてください。
REST APIのテスト
サーバーが起動したら、cURLを使ってAPIとやり取りできます。以下はコマンド例です:
-
全タスクの取得:
curl -s http://localhost:8080/api/tasks # Output: # { # "tasks": [ # ... # ] # } -
特定のタスク(ID 2)の取得:
curl -s http://localhost:8080/api/tasks/2 # Output: # { # "task": { # ... # } # } -
新しいタスクの作成:
curl -s -X POST -H "Content-Type: application/json" \ -d '{"title": "New task", "description": "Created with cURL"}' \ http://localhost:8080/api/tasks # Output: # { # "task": { # ... # } # }
ヒント:出力を見やすくするには、
jqにパイプすると便利です。例えば、curl -s http://localhost:8080/api/tasks/2 | jqでJSONが整形されて表示されます。
Example of Python REST API using Flask, running in Stackhero Code-Hero, with the server (1) and the client using cURL (2)
環境変数の管理
環境変数は、データベース認証情報やAPIキーなどの機密情報を保護するのに役立ちます。これにより、機密データをコードベースやGit履歴から分離し、環境ごとに異なる設定を簡単に適用できます。
環境変数の管理にはpython-dotenvモジュールを利用できます。前のインストール手順をスキップした場合は、今インストールしてください:
pip install python-dotenv
pip freeze > requirements.txt
プロジェクトルートに.envファイルを作成し、開発用の環境変数を追加します:
ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"
.envを.gitignoreに追加し、Gitにコミットされないようにします:
echo ".env" >> .gitignore
Pythonではos.environ.get()でこれらの変数にアクセスできます:
import os
print(os.environ.get('ENV'))
.envファイルは開発専用です。本番やステージング環境では、StackheroダッシュボードのPythonサービス設定から直接環境変数を設定できます。
PythonとFlaskの本番運用準備
Flaskの組み込みサーバーは開発用途には最適ですが、本番環境ではGunicornのような堅牢なWSGIサーバーを利用することを推奨します。準備手順は以下の通りです:
-
Gunicornのインストール:
pip install gunicorn pip freeze > requirements.txt -
Gunicornでアプリを起動:
ENV=production gunicorn app:app \ --error-logfile - \ -b 0.0.0.0:8080ここで
app:appはファイル(app.py)とFlaskアプリケーションインスタンス(app)を指します。 -
Makefileを追加して、開発・本番モードの切り替えを簡単にできます:.DEFAULT_GOAL := dev # Stackhero for Pythonはデフォルトで"run"ルールを実行します。ここでは'prod'を実行するように上書きします。 run: prod prod: ENV=production gunicorn app:app \ --error-logfile - \ -b 0.0.0.0:8080 dev: python app.py
make dev(または単にmake)で開発モード、make prodで本番モードのサーバーを起動できます。
Pythonコードの本番デプロイ
Stackheroを使えば、クラウドへのデプロイが簡単かつ安全に行えます。Python cloud hosting serviceを利用してPythonプロジェクトをデプロイできます。主な特徴は:
git pushだけでデプロイ- カスタマイズ可能なドメインで自動TLS(HTTPS)
- セキュリティのための専用インフラ
- HTTP/2、TLS 1.3、WebSockets、GZIP & Brotli、ETag、TCP/UDPポート両対応
「Stackhero for Python」サービスの設定
デプロイには、以下の手順に従ってください:
-
公開SSHキーを取得:
cat ~/.ssh/id_*.pub -
Stackheroダッシュボードで「Stackhero for Python」サービスを開き、「Configure」を選択します。
-
「SSH public keys」または「Key」欄に公開鍵を貼り付けます。
-
「Validate」をクリックして設定を確認します。
"Stackhero for Python" public key configuration
まだSSHキーをお持ちでない場合は、以下のコマンドで生成できます:
ssh-keygen -t ed25519
Stackheroサービスで表示されるコマンドを使い、Gitリモートをプロジェクトに追加します(<XXXXXX>はご自身のサービスドメインに置き換えてください):
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
Git remote command
本番環境へのデプロイ
準備ができたら、次のコマンドでコードをプッシュしてデプロイします:
git push stackhero main
デプロイ前に必ず変更をコミットしてください。Stackhero Code-Heroでは、コマンドパレット(
Ctrl+Shift+PまたはCmd+Shift+P)でGit: Commitと入力すれば素早くコミットできます。
デプロイ後、APIはhttps://<XXXXXX>.stackhero-network.com/api/tasksで利用可能です。<XXXXXX>をサービスドメインに置き換えてFlask APIにアクセスしてください。
まとめ
これでFlaskを使ったREST APIが完成しました。この基盤があれば、アプリケーションの拡張やデータベース連携、他サービスとの統合も容易です。Flaskは、シンプルなプロトタイプから本格的な本番APIまで柔軟に対応できます。