PythonでREST APIを作ったので検討したフレームワークと手順をまとめました!
バックエンド処理を実装するのにKotlin, Rails, Python, Go, TypeSclipt どれで作ろうか迷った結果
軽量で使い勝手もよい主力言語のPythonに決定しました。
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を使用してアプリケーションを実行
- 左側のアクティビティバーからRun and Debugアイコン(再生ボタンのアイコン)をクリックします。
- 「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 |
コメント