🚀 ニフティ’s Notion

【Webアプリ2025 #11】PythonでAPIを開発する

使用ライブラリ

  • Fast API
  • Pydantic
  • SQLAlchemy

FastAPI

FastAPIとは

Pythonの標準である型ヒントに基づいてAPI を構築するための、モダンで高速(高パフォーマンス)なWeb フレームワーク

FastAPIの特徴

FastAPIの使い方

最もシンプルなFastAPI

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

パスパラメータ

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_item(item_id):
    return {"item_id": item_id}

クエリパラメータ

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]

SQLAlchemy

FastAPIとよく一緒に使用されるORM(Object-Relational Mapping) の一つ

クラスオブジェクトとRDBテーブルとのマッピングを行うもの

  • SQLデータベースの構造を定義するためのクラス
from sqlalchemy.orm import Mapped, mapped_column

class User(Base):
    __tablename__ = "user"

    id: Mapped[int] = mapped_column(primary_key=True)
    email: Mapped[str] = mapped_column(unique=True, nullable=False)
    password: Mapped[str] = mapped_column(nullable=False)
    name: Mapped[str] = mapped_column(nullable=False)

SQLAlchemyのDB操作

  • SQLっぽい操作の query() 、ORMっぽい操作の scalars() がある
    • scalars 推奨
from sqlalchemy import select

from .models import User

def get_user(db: Session, user_id: int):
    return db.scalars(select(User).where(User.id == user_id)).first()
    # Primary Key指定であればget()の方がシンプルに使える
    # return db.get(User, user_id)

# async/await対応版
# AsyncSessionを使うこと、asyn・awaitが追加になること以外は同一
async def get_user(db: AsyncSession, user_id: int):
    return await db.scalars(select(User).where(User.id == user_id)).first()

Pydantic BaseModel

データの入力/出力を定義するためのクラス

from pydantic import BaseModel, EmailStr

class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: str | None = None
    

uvicorn

  • Uvicorn は、Pythonの非同期Webサーバーの一つ
  • FastAPIやStarletteなどの非同期Webフレームワークと組み合わせて使用されることが多い
  • 非常に高速で、 ASGI (Asynchronous Server Gateway Interface) をサポートしており、非同期のリクエスト処理に優れている

uvicorn app.main:app --proxy-headers --host 0.0.0.0 --port 80