Python

[FastAPI] 요청 데이터 접근 - request body

비번변경 2024. 11. 20. 09:16

개요

이전 글에서 FastAPI를 사용할 때의 경로 매개변수, 쿼리 매개변수를 정의하고, 접근하는 방법을 알아보았다.

2024.10.31-[FastAPI] 요청 데이터 접근 - 경로 매개변수

2024.11.03-[FastAPI] 요청 데이터 접근 - 쿼리 매개변수

 

이번 글에서는 FastAPI에서 요청 본문을 정의하고 접근하는 방법을 알아본다.

 

 

request body

HTTP Post 방식으로 통신할 때는 데이터를 request body/response body라고 하는 항목으로 주고받는다.

FastAPI에서는 기존과 동일하게 함수에 매핑된 매개변수로 request body로 접근할 수 있는데, 요청 본문의 형식과 데이터 타입을 Pydantic(데이터 검증 라이브러리)이라는 모듈을 사용하여 정의한다. FastAPI는 내부적으로 Pydantic을 사용하기 때문에 별도로 설치할 필요는 없다.

 

 

request body 정의

request body 형식을 정의할 때는 다음과 같이 pydantic의 BaseModel 임포트 하여 사용한다.

from pydantic import BaseModel

그리고 BaseModel을 상속받는 자식 클래스를 생성하여, 속성과 데이터 타입, 그리고 기본값 등을 정의한다.

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

정의한 모델을 경로에 매핑한 함수의 매개변수로 전달하면 이제 FastAPI는 이 함수에 매핑된 URL로 접근할 때는 Item에서 정의한 형식의 request body를 요구하는 것을 알게 된다. (기본적으로는 JSON 형식인 것 같다.)

from fastapi import FastAPI

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

API 문서를 보면 요청할 때의 예시도 확인할 수 있고, 요청 데이터에 접근할 때는 함수 매개변수에 접근하는 방식으로 사용하면 된다.

 

 

경로 매개변수와 request body 동시 사용

FastAPI는 경로 매개변수와 request body를 동시에 취급할 수 있다. 경로 매개변수에 일치하는 함수 매개변수는 경로에서 가져오고, Pydantic 모델로 선언한 함수 매개변수는 request body에서 가져온다.

@app.post("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}

 

 

참고 문서

https://fastapi.tiangolo.com/ko/tutorial/body/