FastAPI 데이터 유효성 검사 - Pydantic

예찬예찬·2024년 6월 6일

FastAPI

목록 보기
6/10
post-thumbnail

Pydantic은 왜 사용할까?

  • 데이터 유효성 검사 및 직렬화 자동 오류 방지도 ㅇㅁㅇ
  • 자동 문서 생성 → 협업에 용이
  • 개발 측 → 효율성, 유연성, 확장성이 좋다.

Pydantic 기초

기초 원리

  • Python의 타입 힌팅을 사용 → 데이터 유효성 검사, 구조 정의

Pydantic의 핵심 요소는 BaseModel 클래스!

  • Pydantic에서 모든 모델의 기본 클래스 → 이를 상속받아 사용자 정의 모델을 만듦
  • 데이터의 구조, 타입, 기본값 들을 정의할 수 있음.
  • 자동 데이터 유성 검사 등의 구현되어 있는 클래스

기본 사용법

  • 타입 힌트
    • 필드는 변수에 타입 힌트를 사용하여 정의
    • Pydantic은 타입 힌트를 사용하여 데이터 유효성 검사
  • 기본값 설정
    • 필드에 기본값을 제공할 수 있음
    • 이 경우 해당 필드는 선택적 필드가 됨
  • 모델 인스턴스화
    • 인스턴스를 생성할 때 자동으로 데이터 유효성 검사를 수행
  • JSON 직렬화
    • json() 매서드를 사용하여 JSON 문자열로
  • JSON 역직렬화
    • parse_raw()
    • JSON 문자열을 Pydantic 모델 인스턴스로
from pydantic import BaseModel

# 잘못된 타입의 값은 못 들어가요
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = 0.0
# 선택적 데이터
item = Item(name="Apple", descriptoin="Red fruit", price=5.5)
# JSON 직렬화
item_json = item.json()
# JSON 역직렬화
item = Item.parse_raw(item_json)

Pydantic 추가 기능

사용자 정의 유효성 검사기 만들기

  • Pydantic은 @validator 데코레이터를 사용하여 필드에 대한 사용자 정의 유효성 검사를 추가할 수 있다.
from pydantic import BaseModel, validator

class User(BaseModel):
    name: str
    age: int

    @validator('age')
    def check_age(cls, v):
        if v < 18:
            raise ValueError('Age must be at least 18')
        return v
  • 유효성 검사기는 메서드가 인스턴스 수준이 아닌 클래스 수준에서 작동하기 때문에 cls 사용
  • v는 검사할 값을 의미함

복잡한 타입과 중첩된 모델 사용하기

from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    description: str = None
    price: float

class Order(BaseModel):
    id: int
    items: List[Item]

order = Order(id=123, items=[{"name": "Apple", "price":5.5}, {"name": "Banana", "price": 3.0}])

ORM 모드

  • Pydantic은 ORM 모드를 지원하며 ORM 객체를 Pydantic 모델로 쉽게 변환할 수 있음.
from pydantic import BaseModel

class ORMModel:
    def __init__(self, name, age):
        self.name = name
        self.age = age

class UserModel(BaseModel):
    name: str
    age: int

    class Config:
        orm_mode = True

orm_user = ORMModel(name="Alice", age=30)
user = UserModel.form_orm(orm_user)

FastAPI에서 Pydantic 사용

from urllib import response
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class UserInput(BaseModel):
    name: str
    age: int

class UserResponse(BaseModel):
    name: str
    age: int
    is_adult: bool

@app.post("/user/", response_model=UserResponse)
def create_user(user: UserInput):
    # 입력 받은 데이터를 처리
    is_adult = user.age >= 18
    # 응답 모델을 사용하여 응답ㄷ 데이터를 구성
    response_data = UserResponse(
        name = user.name,
        age = user.age,
        is_adult = is_adult
    )
    return response_data

velidator 때문에 함수가 실제 반환하는 데이터와의 일관성을 주의 해야 함. 밸리데이터가 별도로 정의 된다는 것을 명확히 해줘야 불일치성 발생을 방지 할 수 있음.

profile
나는 오예찬

0개의 댓글