【Python入門】Fast APIの実装手順とフレームワーク技術選定

PR
【Python入門】Fast APIの実装手順とフレームワーク技術選定
この記事は約15分で読めます。

PythonでREST APIを作ったので検討したフレームワークと手順をまとめました!

バックエンド処理を実装するのにKotlin, Rails, Python, Go, TypeSclipt どれで作ろうか迷った結果
軽量で使い勝手もよい主力言語のPythonに決定しました。

  1. Pythonを選定した理由
  2. そもそもREST APIってなに?
    1. REST APIの説明
      1. HTTPメソッド
      2. ステータスコード
  3. PythonのAPIフレームワーク
    1. Flask
    2. Django
    3. FastAPI
    4. 選定したフレームワーク
  4. 事前準備、ローカル環境構築
    1. 1.VSCodeのインストール(必要に応じて)
      1. ここで必要な拡張機能のインストール
    2. 2. pyenvのインストール(必要に応じて)
    3. 3. Pythonのインストール(必要に応じて)
    4. 4. 仮想環境の作成と有効化
      1. pyenvを使用して仮想環境を作成
      2. 仮想環境を有効化
      3. Pythonインタープリターを設定
    5. 5. FastAPIとUvicornのインストール
    6. 6. FastAPIプロジェクトのセットアップ
      1. 任意のフォルダにて下記の構成でファイルを配置する
      2. requirements.txt ファイルに依存関係を記述
      3. app/main.py ファイルを作成し、以下のコードを追加
    7. 7. VSCodeのRun and Debug設定
      1. デバッグ設定ファイルの作成
      2. launch.json ファイルに以下の設定を追加
    8. 8. FastAPIアプリケーションの実行
      1. VSCodeのRun and Debugを使用してアプリケーションを実行
    9. 9. APIエンドポイントのテスト
      1. ブラウザやAPIクライアント(例:Postman)を使用して、以下のURLにアクセスしてAPIをテスト
  5. FastAPIを使った実装
    1. そもそもCRUD とは?
    2. そもそもCRUD APIとは?
      1. Create(作成): POST リクエスト
      2. Read(読み取り): GET リクエスト
      3. Update(更新): PUT または PATCH リクエスト
      4. Delete(削除): DELETE リクエスト
    3. FastAPIを使用したCRUD APIの実装例
  6. APIのテスト実行
  7. この後の記事予定
  8. 寄付の依頼

Pythonを選定した理由

こちらでも紹介した通り、せっかく作るなら現在と今後の需要を考えた技術選定が重要だと考えたためです。

そもそもREST APIってなに?

APIって正確な呼び名と種類があるの知っていましたか?
近年のWEB開発では、APIというとほとんどがREST APIを意味していることが多いです。

  • REST API
  • SOAP API
  • GraphQL
  • gRPC
  • WebSocket API(リアルタイム通信でよく使われます)

他にもこのような通信手法があります。

REST APIの説明

REST API(Representational State Transfer API)は、Web標準のHTTPプロトコルを使用してリソースにアクセスし、操作するためのシンプルでスケーラブルな方法を提供します。

シンプルで広く使用されていることが特徴で。

HTTPメソッド

REST APIでは、HTTPメソッドを使用してリソースに対する操作を定義します。

主なメソッドは以下の通りです

  • GET: リソースの取得
  • POST: 新しいリソースの作成
  • PUT: 既存のリソースの更新
  • DELETE: リソースの削除
  • PATCH: リソースの部分的な更新

ステータスコード

HTTPステータスコードは、リクエストの結果を示します。

主なステータスコードの例:

  • 200 OK: リクエストが成功し、レスポンスが返されました。
  • 201 Created: リクエストが成功し、新しいリソースが作成されました。
  • 204 No Content: リクエストが成功しましたが、レスポンスボディがありません。
  • 400 Bad Request: クライアントのリクエストが無効です。
  • 404 Not Found: 指定されたリソースが見つかりません。
  • 500 Internal Server Error: サーバー側でエラーが発生しました。

PythonのAPIフレームワーク

Pythonでは、APIを実装するためのフレームワークとして、Flask、Django、FastAPIの3つがよく使用されます。

Flask

公式サイト: Flask

特徴:

  • 軽量でシンプル:Flaskは非常に軽量で、シンプルなAPIを迅速に構築できます。
  • 拡張可能:必要な機能をプラグインや拡張機能として追加できます。
  • 柔軟性:プロジェクトの構造や使用するライブラリの選択に柔軟性があります。
  • 学習コストが低い:シンプルなAPIを構築するために必要な学習コストが比較的低いです。

特徴:

  • 軽量でシンプル:Flaskは非常に軽量で、シンプルなAPIを迅速に構築できます。
  • 拡張可能:必要な機能をプラグインや拡張機能として追加できます。
  • 柔軟性:プロジェクトの構造や使用するライブラリの選択に柔軟性があります。
  • 学習コストが低い:シンプルなAPIを構築するために必要な学習コストが比較的低いです。
  • 適用例:
    • 小規模から中規模のWebアプリケーションやAPI
    • プロトタイプの開発やシンプルなサービス

Django

公式サイト: Django

特徴:

  • フルスタック:Djangoは、認証、ORM、管理インターフェース、フォームハンドリングなど、Webアプリケーション開発に必要な機能を全て備えています。
  • 強力な管理インターフェース:自動生成される管理インターフェースは、データベース管理を容易にします。
  • 高度な認証と認可:ユーザー認証や権限管理が容易に実装できます。
  • コミュニティとエコシステム:巨大なコミュニティと豊富なサードパーティパッケージが利用可能です。

適用例:

  • 大規模なWebアプリケーションやAPI
  • 管理画面が必要な業務アプリケーション
  • 高度な認証や認可が必要なプロジェクト

FastAPI

公式サイト: FastAPI

特徴:

  • 高速なパフォーマンス:非同期処理をサポートし、非常に高速です。
  • 自動生成されたドキュメント:Swagger UIやReDocによる自動生成されたAPIドキュメントが提供されます。
  • 型ヒントによるバリデーション:Pythonの型ヒントを利用して自動的にリクエストのバリデーションを行います。
  • 開発者の生産性向上:少ないコード量で多くの機能を実現でき、開発者の生産性が向上します。

適用例

  • 高パフォーマンスが要求されるリアルタイムアプリケーション
  • 型ヒントを活用したバリデーションやドキュメントが必要なAPI
  • 非同期処理が必要なプロジェクト

選定したフレームワーク

FastAPI に決めました。

FastAPIは、2018年と割と新しい且つ構文がシンプルなため、こちらを採用!

Flaskは、2010年くらいから存在し、もっとも使われている印象を思っています。
Djangoは、2005年くらいから存在しており、こちらもよく聞くフレームワークですね。

事前準備、ローカル環境構築

1.VSCodeのインストール(必要に応じて)

VSCodeがまだインストールされていない場合は、公式サイトからインストールしてください。

ここで必要な拡張機能のインストール

VSCodeを開き、以下の拡張機能をインストールします

  • Python: Microsoftが提供するPython拡張機能
  • Pylance: Microsoftが提供するPython言語サーバー

2. pyenvのインストール(必要に応じて)

pyenvの公式サイトを参照してインストール手順に従います

macOS/Linuxの場合

curl https://pyenv.run | bash

シェルの設定ファイルを更新

.bashrc.zshrc、または他のシェル設定ファイルに以下の行を追加します

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv virtualenv-init -)"

設定ファイルを更新した後、シェルを再読み込みします:

source ~/.bashrc  # or source ~/.zshrc

インストール確認

pyenv -v

3. Pythonのインストール(必要に応じて)

Pythonがまだインストールされていない場合は、公式サイトからインストール
(開発現場では直接インストールはあまりせず、バージョン管理ツールを使うことが多いです)

もしくは、pyenvを使用してPythonのバージョンをインストール

# インストールできるPythonバージョンを確認
pyenv install --list

# Pythonインストール 今回は、これで実施 pyenv install 3.12.3
pyenv install {インストールしたいバージョン}

使用するバージョンを指定

# global:全体で使うバージョンを変えたいときに使用
pyenv local 3.x.x

# プロジェクトごとで違うバージョンを使いたいときに使用
cd {プロジェクトフォルダ} 
pyenv global 3.y.y

4. 仮想環境の作成と有効化

プロジェクトのフォルダで実施

pyenvを使用して仮想環境を作成

python -m venv venv

仮想環境を有効化

source venv/bin/activate

# 作業が終わったら仮想環境を無効化します
deactivate

Pythonインタープリターを設定

Pythonバージョンをクリックし、Pythonインタープリターを選択します

5. FastAPIとUvicornのインストール

仮想環境が有効になっている状態で以下のコマンドを実行します

pip install fastapi uvicorn

6. FastAPIプロジェクトのセットアップ

任意のフォルダにて下記の構成でファイルを配置する

{任意のフォルダ名}/
├── app/
│   ├── __init__.py
│   └── main.py
└── requirements.txt

requirements.txt ファイルに依存関係を記述

fastapi
uvicorn

app/main.py ファイルを作成し、以下のコードを追加

from fastapi import FastAPI

app = FastAPI()

# http://xxxxxx/
@app.get("/")
async def get_root():
    return {"message": "Hello, World!"}

# http://xxxxxx/items/1?q=test
@app.get("/items/{item_id}")
async def get_item(item_id: int, q: Optional[str] = None):
    // item_id:1
    // q: test
    return {"item_id": item_id, "q": q}

7. VSCodeのRun and Debug設定

デバッグ設定ファイルの作成

VSCodeでデバッグ設定ファイルを作成します。.vscode フォルダを作成し、その中に launch.json ファイルを作成します。

launch.json ファイルに以下の設定を追加

{
"version": "0.2.0",
"configurations": [
{
"name": "Python: FastAPI",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/venv/bin/uvicorn",
"args": [
"app.main:app",
"--host",
"0.0.0.0",
"--port",
"8000",
"--reload"
],
"console": "integratedTerminal"
}
]
}

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

VSCodeのRun and Debugを使用してアプリケーションを実行

  1. 左側のアクティビティバーからRun and Debugアイコン(再生ボタンのアイコン)をクリックします。
  2. 「Python: FastAPI」設定を選択してデバッグを開始します。

9. APIエンドポイントのテスト

ここまで確認できればAPIのローカル環境構築は終了

ブラウザやAPIクライアント(例:Postman)を使用して、以下のURLにアクセスしてAPIをテスト

  • ルートエンドポイント: http://localhost:8000/
    • 期待されるレスポンス: {"message": "Hello, World!"}
  • アイテムエンドポイント: http://localhost:8000/items/1?q=test
    • 期待されるレスポンス: {"item_id": 1, "q": "test"}

FastAPIを使った実装

そもそもCRUD とは?

CRUDは、以下の4つの操作を指します

  • Create(作成):新しいデータを作成し、データベースに保存する
  • Read(読み取り):既存のデータを読み取る操作。これは単一のレコードの読み取りや複数のレコードの読み取りを含みます。
  • Update(更新):既存のデータを更新する操作。特定のレコードの情報を変更します。
  • Delete(削除):既存のデータを削除する操作。特定のレコードをデータベースから削除します。

そもそもCRUD APIとは?

CRUD APIは、前述のCRUD操作をHTTPリクエスト(通常はRESTfulな設計)を介して実行できるようにするWeb APIです。
以下は、それぞれのCRUD操作に対応する典型的なHTTPメソッドとエンドポイントの例です。

Create(作成): POST リクエスト

  • エンドポイント: /items
  • 例: 新しいアイテムを作成するためのリクエスト
POST /items
{
    "id": 1,
    "name": "Item 1",
    "price": 10.0,
    "tax": 1.0
}

Read(読み取り): GET リクエスト

  • エンドポイント: /items(全てのアイテムを取得)または /items/{id}(特定のアイテムを取得)
  • 例: 特定のアイテムを取得するためのリクエスト
GET /items/1

Update(更新): PUT または PATCH リクエスト

  • エンドポイント: /items/{id}
  • 例: 特定のアイテムを更新するためのリクエスト
PUT /items/1
{
    "name": "Updated Item 1",
    "price": 12.0,
    "tax": 1.2
}

Delete(削除): DELETE リクエスト

  • エンドポイント: /items/{id}
  • 例: 特定のアイテムを削除するためのリクエスト
DELETE /items/1

FastAPIを使用したCRUD APIの実装例

以下に、FastAPIを使用して基本的なCRUD APIを実装する例を示します。

このコードでは、FastAPI を使用して基本的なCRUD操作を実行するエンドポイントを定義しています。items_db というリストをメモリ内データベースとして使用しています。

実際のアプリケーションでは、データベース接続を使用することが一般的です。

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI()

# データモデル
class Item(BaseModel):
    id: int
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None

# メモリ内データベース
items_db = []

# Create
@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    items_db.append(item)
    return item

# Read
@app.get("/items/", response_model=List[Item])
async def read_items(skip: int = 0, limit: int = 10):
    return items_db[skip: skip + limit]

@app.get("/items/{item_id}", response_model=Item)
async def read_item(item_id: int):
    for item in items_db:
        if item.id == item_id:
            return item
    raise HTTPException(status_code=404, detail="Item not found")

# Update
@app.put("/items/{item_id}", response_model=Item)
async def update_item(item_id: int, updated_item: Item):
    for index, item in enumerate(items_db):
        if item.id == item_id:
            items_db[index] = updated_item
            return updated_item
    raise HTTPException(status_code=404, detail="Item not found")

# Delete
@app.delete("/items/{item_id}", response_model=Item)
async def delete_item(item_id: int):
    for index, item in enumerate(items_db):
        if item.id == item_id:
            deleted_item = items_db.pop(index)
            return deleted_item
    raise HTTPException(status_code=404, detail="Item not found")

APIのテスト実行

ブラウザやPostmanなどのAPIクライアントを使用して、上記のエンドポイントに対してリクエストを送信することで、CRUD操作をテストできます。

APIクライアントもChromeの拡張機能があるので、とても使いやすいです。ぜひ使いましょう!

この後の記事予定

  • AzureのDB・ストレージの構築と接続
  • Azureを使用した公開用環境の構築、デプロイ(APIとフロントアプリ)
  • 自動デプロイ機能の設定

寄付の依頼

もし、少しでもご参考になりましたらサイト運営への寄付をお願いします。
とても励みになります。

If you would like to help, please make a donation to the site management.
It is very encouraging.

BTC (ビットコイン) アドレス
35AfkHtN3paTC1iNVtHg6BDmCnHmffzQWM
DEEPコイン アドレス
0x43Dbe7F99b4A31bF184b98A8A814ADEC48FB789D
超簡単フリーランスエンジニアになるには?おすすめの案件探し方
経験年数の少なさで諦めていませんか?経験が浅くてもフリーランスエンジニアになれる方法なり方と理由がここにあり。誰でもできる超簡単なおすすめの案件(仕事)の探し方解説!ベストなITエージェントの使い方はこれだ!時代を生き抜く力はフリーランスにあり
【生成AI初心者向け】RAGとは?chunkとは?チャンク化とは解説
生成AIでおなじみのLLM + RAG!そこで重要なchunk(チャンク)、chunk化を中心に初心者向けに解説!chunkについて聞いたことがあるがそもそもよくわかっていない方向けの話!chunk分割やベクトルストアについても触れてみます
需要の高い人気プログラミング言語&フレームワーク【将来性】
数多くの種類の言語からプログラミング初心者にもエンジニアのキャリアアップにも最適な将来性の高い人気のプログラミング言語とおすすめフレームワークを紹介!特に需要の把握はスキルアップと年収に直結です。ガチで必要な全ての選択肢の答えがここに
【React&TypeScript入門】.js .jsx .ts .tsxの違いと使い分けの話
なんとなく使っているけど、.js .jsx .ts .tsxの違いが分からない~使い分けがよくわからない~を解決しよう!React開発でJavaScriptやTypeScriptのどちらを使うべきかそれぞれメリット・デメリットを把握しよう!
【賃貸にスマートロック】玄関におすすめ後付け可能な鍵比較5選
賃貸でも玄関の鍵にスマートロックを後付けすることが可能です。スマホで楽々解錠、急な来客や彼氏彼女に合鍵シェアっておしゃれですね。徹底的に調べて厳選比較しました。【賃貸OK】ITエンジニアがおすすめする賃貸でもできるスマートハウス化計画!
PR
PR

コメント

タイトルとURLをコピーしました