PythonのFastAPIで爆速REST API開発:非同期処理とバリデーション

FastAPIはPython製のWebフレームワークで、型ヒントを活用した自動バリデーション、自動ドキュメント生成、非同期処理対応が特徴です。Flask比で200%以上のパフォーマンス向上が見込めます。

FastAPIの特徴

  • Python型ヒントによる自動バリデーション
  • OpenAPI(Swagger)ドキュメント自動生成
  • async/await対応の非同期処理
  • Pydanticモデルによるデータシリアライゼーション
  • StarletteベースのASGIフレームワーク

インストールと最初のAPI

pip install "fastapi[standard]"
# main.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from typing import Optional
import uvicorn

app = FastAPI(title="商品管理API", version="1.0.0")

class Product(BaseModel):
    name: str = Field(..., min_length=1, max_length=100)
    price: int = Field(..., gt=0, description="価格(円)")
    description: Optional[str] = None
    in_stock: bool = True

# インメモリDB
products: dict[int, Product] = {}
next_id = 1

@app.post("/products", status_code=201)
async def create_product(product: Product):
    global next_id
    product_id = next_id
    products[product_id] = product
    next_id += 1
    return {"id": product_id, **product.model_dump()}

@app.get("/products/{product_id}")
async def get_product(product_id: int):
    if product_id not in products:
        raise HTTPException(status_code=404, detail="商品が見つかりません")
    return {"id": product_id, **products[product_id].model_dump()}

@app.get("/products")
async def list_products(
    min_price: Optional[int] = None,
    max_price: Optional[int] = None,
    in_stock: Optional[bool] = None,
):
    result = []
    for pid, p in products.items():
        if min_price and p.price  max_price:
            continue
        if in_stock is not None and p.in_stock != in_stock:
            continue
        result.append({"id": pid, **p.model_dump()})
    return result

if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)

自動ドキュメント

FastAPIは起動するだけで以下のドキュメントが自動生成されます。

  • Swagger UI: http://localhost:8000/docs – インタラクティブなAPI操作画面
  • ReDoc: http://localhost:8000/redoc – 読みやすいドキュメント形式

非同期処理

FastAPIはasync/awaitをネイティブサポートしています。DB操作やHTTPリクエストなどのI/O処理を非同期で実行できます。

import httpx

@app.get("/external-data")
async def get_external_data():
    async with httpx.AsyncClient() as client:
        response = await client.get("https://api.example.com/data")
        return response.json()

まとめ

FastAPIは、型安全性・パフォーマンス・開発体験の全てにおいて優れたフレームワークです。AI APIのバックエンド、マイクロサービス、プロトタイプ開発など幅広い場面で活躍します。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

IP: 取得中...
216.73.216.31216.73.216.31