참조: https://pydantic-docs.helpmanual.io/usage/models/
Pydantic 에러 처리
정리. 수알치 오상문
pydantic은 데이터 검증(Validation) 단계에서 오류가 발견되면 ValidationError 에러를 발생시킨다.
-----------------------------------------------------------------------------------------------------------
[참고] 유효성 검사 코드는 ValidationError 자체를 발생시키기 보다는 ValidationError를 채우는 데 사용할 ValueError, TypeError 또는 AssertionError(또는 ValueError 또는 TypeError의 하위 클래스)를 발생시켜야 한다.
--------------------------------------------------------------------------------------------------------------
다음과 같은 방법으로 발생한 오류에 접근할 수 있다.
e.errors() : 입력 데이터에서 발견된 오류 목록을 반환하는 메서드
e.json() : 발생한 에러의 JSON 표현을 돌려주는 메서드
str(e) : 에러 내용을 읽기 좋은 표현으로 반환하는 메서드
각 에러 객체는 다음 내용을 포함한다.
Loc : 목록에서 발생한 에러 위치이다. 목록 첫 항목은 오류 발생 필드가 되고 필드가 하위 모델(sub-model)인 경우 후속 항목이 표시되어 오류 중첩 위치를 나타낸다.
Type : 에러 타입이다.
Msg : 에러 메시지이다.
Ctx : 메시지 추가 옵션 정보이다.
다음 예제는 모델 초기화를 하는 작업에서 모델 필드와 맞지 않는 값의 초기화에서 발생하는 에러를 처리한다.
[예제]
from typing import List
from pydantic import BaseModel, ValidationError, conint
class Location(BaseModel):
lat = 0.1
lng = 10.1
class Model(BaseModel):
is_required: float
gt_int: conint(gt=42) # greater than 42
list_of_ints: List[int] = None
a_float: float = None
recursive_model: Location = None
data = dict(
list_of_ints=['1', 2, 'bad'],
a_float='not a float',
recursive_model={'lat': 4.2, 'lng': 'New York'},
gt_int=21,
)
try:
Model(**data) # 모델에 data사전을 키-값 쌍 필드로 초기화
except ValidationError as e:
print(e) # 에러 객체 메시지 출력하기
[출력 결과] -----------------------------------------
5 validation errors for Model
is_required
field required (type=value_error.missing)
gt_int
ensure this value is greater than 42 (type=value_error.number.not_gt;
limit_value=42)
list_of_ints -> 2
value is not a valid integer (type=type_error.integer)
a_float
value is not a valid float (type=type_error.float)
recursive_model -> lng
value is not a valid float (type=type_error.float)
------------------------------------------------------------
try:
Model(**data) # 모델에 data사전을 키-값 쌍 필드로 초기화
except ValidationError as e:
print(e.json()) # JSON 표현으로 에러 메시지 출력하기
[출력 결과] ------------------------------------------------
[
{
"loc": [
"is_required"
],
"msg": "field required",
"type": "value_error.missing"
},
{
"loc": [
"gt_int"
],
"msg": "ensure this value is greater than 42",
"type": "value_error.number.not_gt",
"ctx": {
"limit_value": 42
}
},
{
"loc": [
"list_of_ints",
2
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
},
{
"loc": [
"a_float"
],
"msg": "value is not a valid float",
"type": "type_error.float"
},
{
"loc": [
"recursive_model",
"lng"
],
"msg": "value is not a valid float",
"type": "type_error.float"
}
]
-----------------------------------------------------------------------------
'FastAPI' 카테고리의 다른 글
fastapi uvicorn 웹 서버 실행 옵션 (0) | 2021.12.13 |
---|---|
Pydantic Validators (유효성 검증 기능) (0) | 2021.12.11 |
pydantic 레퍼런스 사이트 (FastAPI 모델 관련) (0) | 2021.12.11 |
FastAPI, SQLAlchemy, MySQL 연동 예제 (0) | 2021.12.11 |
FastAPI 기초 예제 (0) | 2021.12.08 |