헬창 개발자

FastAPI Pydantic : 데이터 검증 및 설정 본문

공부방

FastAPI Pydantic : 데이터 검증 및 설정

찬배 2024. 9. 6. 17:31

 

데이터를 다루다 보면 사용자가 입력하는 값이 의도한 범위 내에서 유효한지 검증하는 작업이 필수적다.

이를 위해 Python에서는 pydantic이라는 아주 유용한 라이브러리를 제공한다.

 

Pydantic은 Python에서 데이터 검증 및 설정을 쉽게 할 수 있도록 도와주는 라이브러리이다.

 

Pydantic은 Python의 타입 힌트를 활용하여 데이터의 유효성을 검사하고, 자동으로 변환하며, 데이터 모델을 정의하는 데 유용하다.

 

주로 FastAPI와 함께 사용되며, 데이터 모델을 정의하고 검증하는 데 강력한 도구로 기능하다.

 

Installation

pip install pydantic

Import

from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel

데이터 검증 

class Movie(BaseModel):
      mid: int
      genre: str
      rate: Union[int, float]
      tag: Optional[str] = None
      date: Optional[datetime] = None
      some_variable_list: List[int] = []


tmp_data = {
    'mid' : '1',
    'genre' : 'action',
    'rate' : 1.5,
    'tag' : None,
    'date' : '2023-01-03 19:12:11'
}

tmp_movie = Movie(**tmp_data)
print(tmp_movie)

위 코드는 Movie라는 class를 정의했고 해당 class는 pydantic의 BaseModel을 상속해서 활용합니다. BaseModel은 객체를 정의하는 방법을 제공한다.

 

Movie class를 보면 다음과 같은 특징으로 정의되어 있다.

  • mid는 int 타입으로 정의
  • genre는 strig 타입으로 정의
  • rate는 int와 float 둘 다 가능하도록 정의
  • tag는 str인데 기본 값은 None
  • date는 datetime 형식인데 기본값은 None
  • some_variable_list는 int로 구성된 List인데 기본 값은 비어있는 list ( [] )

이렇게 정의된 Movie에 tmp_data로 정의된 데이터를 제공해보자.

그럼 아래와 같은 결과를 확인할 수 있다.

mid=1 genre='action' rate=1.5 tag=None date=datetime.datetime(2023, 1, 3, 19, 12, 11) some_variable_list=[]

 

만약 다른 자료형을 넣는다면 어떻게 될까 ?

 

 

mid 타입의 선언은 int형인데 데이터 삽입을 str형으로 넣어봤다.

 

그러면 아래와 같이 “입력은 유효한 정수여야 하며, 문자열을 정수로 구문 분석할 수 없습니다”라는 에러가 발생한다.

Traceback (most recent call last):
  File "D:\test\p1.py", line 22, in <module>
    tmp_movie = Movie(**tmp_data)
                ^^^^^^^^^^^^^^^^^
  File "D:\main.py", line 193, in __init__  
    self.__pydantic_validator__.validate_python(data, self_instance=self)
pydantic_core._pydantic_core.ValidationError: 1 validation error for Movie
mid
  Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='one', input_type=str]
    For further information visit https://errors.pydantic.dev/2.8/v/int_parsing

 

데이터 설정

class Person(BaseModel):
    '''
    gt : 설정된 값보다 큰 
    ge : 설정된 값보다 크거나 같은
    lt : 설정된 값보다 작은 
    le : 설정된 값보다 작거나 같은
    '''
    user_id: int
    username: str = Field(min_length=2, max_length=7)
    user_age: int = Field(gt=1, le=130)

person_info = {
    'user_id': 100,
    'username': 'soojin',
    'user_age': 12
}

tmp_user_data = Person(**person_info)
print(tmp_user_data.json())

데이터를 출력을 하면 올바르게 나오지만, 만약 올바르지 않은 범위에 데이터를 넣으면, 다음과 같은 에러 메세지를 볼 수 있다.

 

pydantic.error_wrappers.ValidationError: 2 validation errors for Person
username
  ensure this value has at least 2 characters (type=value_error.any_str.min_length; limit_value=2)
user_age
  ensure this value is less than or equal to 130 (type=value_error.number.not_le; limit_value=130)
Comments