Python: REST APIの作成

PythonのFlaskでREST APIを構築するためのステップバイステップガイド

👋 Stackhero ドキュメントへようこそ!

Stackhero は、デプロイ作業を効率化するために設計された、すぐに使える Python クラウド ソリューションを提供しています:

  • シンプルな git push だけで、数秒でアプリケーションを本番環境にデプロイできます。
  • ご自身のドメイン名を利用可能で、HTTPS 証明書の自動設定により安全な接続も自動で管理されます。
  • 自動バックアップワンクリックアップデート予測可能な料金体系により、インフラ管理ではなくコードに集中できます。
  • プライベートかつ専用インフラ上で、強力なパフォーマンスセキュリティを実現。お客様の環境は分離され、保護されています。

時間を節約し、ワークフローをシンプルに:Stackhero の Python クラウドホスティング なら、わずか 5分でコードを稼働させることができます。

このガイドでは、PythonとFlaskを使ってシンプルなREST APIを作成する方法を解説します。Flaskは軽量なマイクロフレームワークで、WebアプリケーションやAPIを迅速に構築するのに最適です。

始める前に、以下のツールがインストールされていることを確認してください:

  1. Python
  2. pip
  3. git
  4. asdf

環境構築のサポートが必要な場合は、Development platformガイドをご参照ください。また、オンラインのCode-Heroプラットフォームを使えば、すぐにコーディングを始めることも可能です。Code-HeroはオンラインIDEとターミナルを提供しており、必要なツールがすべて事前にインストールされています。これにより、インストールやセットアップに煩わされることなく、コードに集中できます。

Python REST API running in Code-Hero, accessible directly from the browserPython 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はシンプルかつ高速に設計されており、余計なオーバーヘッドなしでWeb APIを構築・デプロイできます。ルーティング、テンプレート、HTTPリクエスト処理などの機能が標準で備わっているため、アイデアから動作するAPIまでを短時間で実現できます。

Flaskとpython-dotenvはpipでインストールできます:

pip install Flask python-dotenv

python-dotenvは環境変数を安全かつ便利に管理するために含めています。後のステップでその使い方を説明します。

インストール後、依存パッケージをrequirements.txtファイルに固定します:

pip freeze > requirements.txt

依存パッケージを固定することで、全員が同じバージョンを利用できるようになります。この小さな手間が、後々のトラブルシューティングの時間を大幅に削減します。

ここから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ドメインに置き換えてください。

サーバーが起動したら、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)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サービス設定から直接環境変数を設定できます。

Flaskの組み込みサーバーは開発用途には最適ですが、本番環境ではGunicornのような堅牢なWSGIサーバーを利用することを推奨します。準備手順は以下の通りです:

  1. Gunicornのインストール:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Gunicornでアプリを起動:

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    

    ここでapp:appはファイル(app.py)とFlaskアプリケーションインスタンス(app)を指します。

  3. 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で本番モードのサーバーを起動できます。

Stackheroを使えば、クラウドへのデプロイが簡単かつ安全に行えます。Python cloud hosting serviceを利用してPythonプロジェクトをデプロイできます。主な特徴は:

  • git pushだけでデプロイ
  • カスタマイズ可能なドメインで自動TLS(HTTPS)
  • セキュリティのための専用インフラ
  • HTTP/2、TLS 1.3、WebSockets、GZIP & Brotli、ETag、TCP/UDPポート両対応

デプロイには、以下の手順に従ってください:

  1. 公開SSHキーを取得:

    cat ~/.ssh/id_*.pub
    
  2. Stackheroダッシュボードで「Stackhero for Python」サービスを開き、「Configure」を選択します。

  3. 「SSH public keys」または「Key」欄に公開鍵を貼り付けます。

  4. 「Validate」をクリックして設定を確認します。

"Stackhero for Python" public key configuration"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 commandGit 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まで柔軟に対応できます。