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: 무중단 배포와 모니터링
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (725)
      • 스마트팜 (0)
      • 상품 추천 (223)
      • MongoDB (4)
      • 하드웨어 (17)
      • 일기장 (4)
      • 파이썬 (130)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • 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)
  • 인기 글

  • 태그

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

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

티스토리툴바