Python: REST APIの作成

Flaskを使用したREST APIの作成方法

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

Stackheroは、数多くの利点を提供するPythonクラウドソリューションを提供しています。主な利点は以下の通りです:

  • シンプルなgit pushでアプリケーションを数秒でデプロイ
  • 独自のドメイン名を使用し、HTTPS証明書の自動設定による強化されたセキュリティを享受。
  • 自動バックアップワンクリックアップデート、そしてシンプルで透明性のある予測可能な価格設定で安心を提供。
  • プライベートで専用のVMによる最適なパフォーマンスと強固なセキュリティを実現。

時間を節約し、生活を簡素化: StackheroのPythonクラウドホスティングソリューションを試すのに5分しかかかりません

このドキュメントは、PythonでREST APIを作成するための初心者向けガイドです。

この例では、Flaskという軽量で使いやすいマイクロフレームワークを使用して、迅速にWebアプリケーションを作成します。

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

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

開発環境がまだ設定されていない場合は、Development platformガイドを参照して詳細な手順を確認してください。あるいは、オンラインのCode-Heroプラットフォームを使用することもできます。Code-Heroは、すべての必要なツールが事前にインストールされたオンラインIDEとターミナルを提供しており、インストールなしで即座にコーディングを開始できます。

ブラウザから直接アクセス可能なCode-Heroで実行されるPython REST APIブラウザから直接アクセス可能なCode-Heroで実行されるPython REST API

最初のステップは、新しいプロジェクトディレクトリを作成することです。このガイドでは、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という1つの依存関係のみが必要です。

Flaskは、迅速なWebアプリケーション開発を可能にする軽量なWebフレームワークです。シンプルで使いやすく設計されており、開発者が迅速にWebサービスを構築および展開できるようにします。ルーティング、テンプレート、HTTPリクエストの処理をサポートしており、REST APIの作成に最適です。

pipを使用してFlask(およびpython-dotenv)をインストールします。

pip install Flask python-dotenv

ここではFlaskpython-dotenvモジュールをインストールしています。python-dotenvを使用する理由はすぐにわかります(ヒント:環境変数の管理のためです)。

インストール後、パッケージのバージョンをrequirements.txtファイルに固定します。

pip freeze > requirements.txt

依存関係を固定することで、プロダクションサーバーや同僚が同じバージョンを使用することを保証します。数秒の作業で将来の多くの頭痛を防ぐことができます。

それでは、コードに入りましょう!

app.pyという名前のファイルを作成し、次のコードを挿入します。

import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request

# 本番環境でない場合、.envファイルから環境変数をロード
if os.environ.get('ENV') != 'production':
    load_dotenv()

# Flaskアプリを作成
app = Flask(__name__)

# サンプルデータセット
tasks = [
    {
        'id': 1,
        'title': '買い物をする',
        'description': '牛乳、チーズ、ピザ、フルーツ',
        'done': False
    },
    {
        'id': 2,
        'title': 'Pythonを学ぶ',
        'description': 'Pythonプログラミングの基礎を学ぶ',
        'done': False
    }
]

# '/api/tasks' (GET) ルートで全タスクをリスト
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

# '/api/tasks/<task_id>' (GET) ルートで特定のタスクをIDで取得
@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 len(task) == 0:
        return jsonify({'error': 'タスクが見つかりません'}), 404
    return jsonify({'task': task[0]})

# '/api/tasks' (POST) ルートで新しいタスクを作成
@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'タイトルが必要です'}), 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

# APIサーバーを開始
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を使用してそれと対話できます。いくつかの例を示します。

  • すべてのタスクを取得する:

    curl -s http://localhost:8080/api/tasks
    {
      "tasks": [
        {
          "description": "牛乳、チーズ、ピザ、フルーツ",
          "done": false,
          "id": 1,
          "title": "買い物をする"
        },
        {
          "description": "Pythonプログラミングの基礎を学ぶ",
          "done": false,
          "id": 2,
          "title": "Pythonを学ぶ"
        }
      ]
    }
    
  • ID 2のタスクを取得する:

    curl -s http://localhost:8080/api/tasks/2
    {
      "task": {
        "description": "Pythonプログラミングの基礎を学ぶ",
        "done": false,
        "id": 2,
        "title": "Pythonを学ぶ"
      }
    }
    
  • 新しいタスクを作成する:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "新しいタスク", "description": "cURLで作成"}' \
    http://localhost:8080/api/tasks
    {
      "task": {
        "description": "cURLで作成",
        "done": false,
        "id": 3,
        "title": "新しいタスク"
      }
    }
    

ヒント:出力をjqにパイプしてJSONを美しく表示します。例えば、curl -s http://localhost:8080/api/tasks/2 | jqはより読みやすい結果を生成します。

Stackhero Code-Heroで実行されるFlaskを使用したPython REST APIの例。サーバー(1)とcURLを使用するクライアント(2)Stackhero Code-Heroで実行されるFlaskを使用したPython REST APIの例。サーバー(1)とcURLを使用するクライアント(2)

環境変数は、データベースの資格情報やAPIキーなどの機密情報を保護するために重要です。環境変数を使用する主な利点は2つあります。

  1. 秘密情報がGitリポジトリに保存されないため、ソースコードにアクセスされても不正な人物が機密データにアクセスできません。
  2. 異なる環境(例:本番と開発)で異なる資格情報を使用できます。

環境変数を管理するために、python-dotenvモジュールを使用します。まず、まだインストールしていない場合はインストールします。

pip install python-dotenv
pip freeze > requirements.txt

次に、プロジェクトのルートに.envファイルを作成し、開発環境の変数を追加します。例えば:

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"

最後に、.envファイルを.gitignoreに追加してセキュリティを維持します。

echo ".env" >> .gitignore

Pythonでこれらの環境変数にアクセスするには、単にos.environ.get()を使用します。

import os

print(os.environ.get('ENV'))

.envファイルは開発環境でのみ使用されます。ステージングや本番環境では、Stackheroダッシュボードで環境変数を設定してください。

このガイドではFlaskの組み込み開発サーバーを使用していますが、本番環境ではGunicornのような本番対応のWSGIサーバーを使用することが重要です。次の手順に従ってください。

  1. Gunicornをインストールします。

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. app:app引数を使用してGunicornでアプリを起動します(最初のappはファイル名、2番目のappはFlaskインスタンスです)。

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    
  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を使用して本番モードで実行できます。

Pythonプロジェクトを展開する最も簡単な方法は、StackheroのPythonクラウドホスティングサービスを使用することです。主な機能には以下が含まれます。

  • シンプルなgit pushでの展開
  • 自動TLS証明書管理(HTTPS)を備えたカスタマイズ可能なドメイン
  • 最大限のセキュリティのためのプライベートで専用のVM上で実行
  • HTTP/2、TLS 1.3(HTTPS)、WebSockets、GZIP & Brotli圧縮、ETag、TCP/UDPポートアクセスをサポート

Stackheroにコードを展開するには、次の手順に従います。

  1. 次を使用して公開鍵を取得します。

    cat ~/.ssh/id_*.pub
    
  2. Stackheroダッシュボードで、"Stackhero for Python"サービスに移動し、"Configure"ボタンをクリックします。

  3. 最初のステップで取得した公開鍵をコピーし、"SSH public keys"または"Key"フィールドに貼り付けます。

  4. ページ下部の"Validate"ボタンをクリックして設定を検証します。

"Stackhero for Python"公開鍵設定"Stackhero for Python"公開鍵設定

SSHキーがない場合は、次を実行して作成します。

ssh-keygen -t ed25519

最後に、リポジトリをStackheroに展開するように設定します。プロジェクトフォルダで、Stackheroサービスで提供されたコマンドを使用してGitリモートを追加します(<XXXXXX>をサービスのドメインに置き換えます)。

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

GitリモートコマンドGitリモートコマンド

すべてが設定されたら、次のコマンドでコードを本番環境に展開します。

git push stackhero main

コードを本番環境にプッシュする前に、変更を追加してコミットすることを確認してください。Stackhero Code-Heroでは、Command Paletteを使用して迅速に変更をコミットできます(Windows/LinuxではCtrl+Shift+P、macOSではCmd+Shift+Pを押し、Git: Commitと入力)。

展開後、https://<XXXXXX>.stackhero-network.com/api/tasks<XXXXXX>をサービスのドメインに置き換えます)でAPI URLにアクセスして、Flask APIの動作を確認してください。

このガイドに従うことで、Flaskを使用してREST APIを作成する方法を理解しました。この知識を活用して、RESTfulアプリケーションを自信を持って開発および拡張し、さまざまなフロントエンドおよびバックエンドサービスと統合できます。