요청 바디 검증하기

심준석·2024년 5월 2일
0

FastAPI

목록 보기
4/11
post-custom-banner

pydantic 모델을 사용한 요청 바디 검증하기

FastAPI에서는 정의된 데이터만 전송되도록 요청 바디를 검증할 수 있다. 이는 요총 데이터가 적절한지 확인하고 악의적인 공격의 위험을 줄여줄 수 있기에 매우매우 중요하다.

pydantic?
파이썬의 타입 어노테이션을 사용해 데이터를 검증하는 파이썬 라이브러리

FastAPI에서 모델은 데이터가 어떻게 전달되고 처리돼야 하는지를 정의하는 구조화된 클래스로, 모델은 pydantic의 BaseModel 클래스의 하위 클래스로 생성된다.

모델은 요청 바디 객체와 요청 응답 객체의 유형에 관한 힌트를 제공한다.

pydantic을 사용해 요청 바디를 검증하는 부분

from pydantic import BaseModel

class Todo(BaseModel):
    id: int
    item: str

이 모델을 POST 라우트에 사용해보자

from fastapi import APIRouter
from model import Todo # todo.py 파일에 모델 임포트

todo_router = APIRouter()

todo_list = []

@todo_router.post("/todo")
async def add_todo(todo: Todo) -> dict: #todo에 Todo 사용
    todo_list.append(todo)
    return {
        "message":"Todo added successfully!"
    }

@todo_router.get("/todo")
async def retreive_todos() -> dict:
    return {
        "todos":todo_list
    }

빈 딕셔너리를 요청 바디로 보내서 모델이 제대로 검증되는지 확인하자

curl -X 'POST' 'http://127.0.0.1:8000/todo' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{}'

성공했다.

성공하면...안되는데..?

모델과 일치하는 데이터를 보내보자

curl -X 'POST' 'http://127.0.0.1:8000/todo' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"id":2, "item":"Validation"}'

중첩 모델

pydantic 모델은 다음과 같이 중첩해서 정의할 수 있다.

from pydantic import BaseModel

class Item(BaseModel):
    item: str
    status: str

class Todo(BaseModel):
    id: int
    item: Item

결과적으로 Todo형의 데이터는

{
  "id": 1,
  "item": {
    "item": "Nested models",
    "status": "completes"
  }
}
profile
Developer & Publisher 심준석 입니다.
post-custom-banner

0개의 댓글