FastAPI CRUD 스타터

FastAPI로 만드는 RESTful CRUD API 보일러플레이트. Pydantic 모델, 라우터, 예외 처리 포함.

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

app = FastAPI(title="My API", version="1.0.0", docs_url="/docs")


class Item(BaseModel):
    id: Optional[int] = None
    name: str
    description: Optional[str] = None
    price: float
    is_active: bool = True


items_db: List[Item] = []


@app.get("/", tags=["health"])
def root():
    return {"message": "API is running", "docs": "/docs"}


@app.get("/items", response_model=List[Item], tags=["items"])
def list_items():
    return items_db


@app.get("/items/{item_id}", response_model=Item, tags=["items"])
def get_item(item_id: int):
    for item in items_db:
        if item.id == item_id:
            return item
    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")


@app.post("/items", response_model=Item, status_code=status.HTTP_201_CREATED, tags=["items"])
def create_item(item: Item):
    item.id = len(items_db) + 1
    items_db.append(item)
    return item


@app.put("/items/{item_id}", response_model=Item, tags=["items"])
def update_item(item_id: int, payload: Item):
    for i, item in enumerate(items_db):
        if item.id == item_id:
            payload.id = item_id
            items_db[i] = payload
            return payload
    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")


@app.delete("/items/{item_id}", status_code=status.HTTP_204_NO_CONTENT, tags=["items"])
def delete_item(item_id: int):
    for i, item in enumerate(items_db):
        if item.id == item_id:
            items_db.pop(i)
            return
    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Item not found")