FastAPI 쿼리 매개변수

2025. 2. 9. 10:50·파이썬/Fast API
반응형

쿼리 매개변수는 FastAPI에서 데이터를 전달받는 핵심적인 방법 중 하나입니다. 다양한 데이터 타입을 어떻게 처리하는지 자세히 알아보겠습니다.

기본적인 쿼리 매개변수 사용

from fastapi import FastAPI, Query
from typing import Optional

app = FastAPI()

@app.get("/items/")
async def read_items(
    skip: Optional[int] = Query(default=0, ge=0),
    limit: int = Query(default=10, le=100),
    search: str = Query(default=None, min_length=3, max_length=50)
):
    return {
        "skip": skip,
        "limit": limit,
        "search": search
    }

날짜 데이터 처리하기

FastAPI에서는 datetime 객체를 직접 사용할 수 있습니다.

from fastapi import FastAPI, Query
from datetime import date, datetime
from typing import Optional

app = FastAPI()

@app.get("/events/")
async def get_events(
    start_date: date = Query(default=None),  # YYYY-MM-DD 형식
    end_date: date = Query(default=None),
    event_type: Optional[str] = None
):
    return {
        "start_date": start_date,
        "end_date": end_date,
        "event_type": event_type
    }

@app.get("/logs/")
async def get_logs(
    timestamp: datetime = Query(default=None)  # YYYY-MM-DD HH:MM:SS 형식
):
    return {"timestamp": timestamp}

복잡한 데이터 타입 처리

from enum import Enum
from pydantic import BaseModel, constr
from typing import List, Optional

class UserType(str, Enum):
    ADMIN = "admin"
    USER = "user"
    GUEST = "guest"

class DateRange(BaseModel):
    start_date: date
    end_date: date

@app.get("/users/")
async def get_users(
    user_type: UserType = Query(default=UserType.USER),
    age: Optional[int] = Query(default=None, ge=0, le=120),
    email: Optional[str] = Query(
        default=None,
        regex="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"
    ),
    tags: List[str] = Query(default=[])
):
    return {
        "user_type": user_type,
        "age": age,
        "email": email,
        "tags": tags
    }

커스텀 유효성 검사

from fastapi import Query, HTTPException
from datetime import date, timedelta

def validate_date_range(start_date: date, end_date: date):
    if start_date and end_date and start_date > end_date:
        raise HTTPException(
            status_code=400,
            detail="시작 날짜는 종료 날짜보다 이전이어야 합니다."
        )

@app.get("/reservations/")
async def get_reservations(
    start_date: date = Query(default=None),
    end_date: date = Query(default=None),
    room_type: Optional[str] = None
):
    if start_date and end_date:
        validate_date_range(start_date, end_date)

    # 최대 예약 기간 제한
    if start_date and end_date:
        date_diff = end_date - start_date
        if date_diff.days > 30:
            raise HTTPException(
                status_code=400,
                detail="예약 기간은 30일을 초과할 수 없습니다."
            )

    return {
        "start_date": start_date,
        "end_date": end_date,
        "room_type": room_type
    }

고급 쿼리 매개변수 예시

from typing import Union
from pydantic import BaseModel, constr

class FilterParams(BaseModel):
    search: Optional[str] = None
    category: Optional[str] = None
    min_price: Optional[float] = None
    max_price: Optional[float] = None
    date_from: Optional[date] = None
    date_to: Optional[date] = None

@app.get("/products/")
async def get_products(
    # 복잡한 필터링
    params: FilterParams = Depends(),

    # 정렬
    sort_by: str = Query(
        default="date",
        regex="^(date|price|name)$"
    ),
    order: str = Query(
        default="desc",
        regex="^(asc|desc)$"
    ),

    # 페이지네이션
    page: int = Query(default=1, ge=1),
    per_page: int = Query(default=10, ge=1, le=100)
):
    return {
        "filters": params.dict(),
        "sorting": {"sort_by": sort_by, "order": order},
        "pagination": {"page": page, "per_page": per_page}
    }

날짜 데이터 파싱 커스터마이징

from datetime import date
from typing import Optional
from fastapi import Query, HTTPException

def parse_date(date_str: str) -> date:
    try:
        return date.fromisoformat(date_str)
    except ValueError:
        raise HTTPException(
            status_code=400,
            detail="날짜 형식이 올바르지 않습니다. YYYY-MM-DD 형식을 사용하세요."
        )

@app.get("/custom-date/")
async def get_with_custom_date(
    target_date: str = Query(default=None)
):
    if target_date:
        parsed_date = parse_date(target_date)
        return {"parsed_date": parsed_date}
    return {"parsed_date": None}

이러한 방식으로 FastAPI에서 다양한 데이터 타입의 쿼리 매개변수를 처리할 수 있습니다. 특히 날짜 데이터는 ISO 형식(YYYY-MM-DD)을 기본적으로 지원하며, 필요한 경우 커스텀 파싱 로직을 추가할 수 있습니다.

저작자표시 비영리 변경금지 (새창열림)

'파이썬 > Fast API' 카테고리의 다른 글

FastAPI-Users with MongoDB: JWT 인증  (0) 2025.02.21
pyinstrument : 성능 최적화를 위한 프로파일링  (0) 2025.02.11
FastAPI와 Nginx : 웹 서버 구성  (1) 2025.02.07
FastAPI 프로젝트 배포 자동화 가이드 Part 3: 무중단 배포와 모니터링  (0) 2025.02.05
FastAPI 프로젝트 배포 자동화 가이드 Part 2: CD 파이프라인과 서버 배포  (2) 2025.02.04
'파이썬/Fast API' 카테고리의 다른 글
  • FastAPI-Users with MongoDB: JWT 인증
  • pyinstrument : 성능 최적화를 위한 프로파일링
  • FastAPI와 Nginx : 웹 서버 구성
  • FastAPI 프로젝트 배포 자동화 가이드 Part 3: 무중단 배포와 모니터링
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
  • 전체
    오늘
    어제
    • 분류 전체보기 (529)
      • 상품 추천 (41)
      • MongoDB (4)
      • 하드웨어 (9)
      • 일기장 (4)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • 파이썬 (127)
        • Basic (40)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (48)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 다비즈
  • 공지사항

  • 인기 글

  • 태그

    스크립트 실행
    programming101
    programmerlife
    리스트
    C#
    스크립트 실행 순서
    긴유통기한우유
    learntocode
    list
    카페24리뷰
    codingtips
    appdevelopment
    unity
    Python
    셀레니움
    devlife
    믈레코비타멸균우유
    cv2
    스마트스토어리뷰
    쇼핑몰리뷰
    카페24리뷰이관
    상품 리뷰 크롤링
    ipcamera
    유니티
    rtsp
    라떼우유
    리뷰관리
    리뷰이관
    파이썬
    codingcommunity
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
FastAPI 쿼리 매개변수
상단으로

티스토리툴바