개요
아래 글들을 통해 FastAPI에서 요청 데이터를 어떻게 정의하고 접근하는지 알아보았다.
2024.10.31-[FastAPI] 요청 데이터 접근 - 경로 매개변수
2024.11.03-[FastAPI] 요청 데이터 접근 - 쿼리 매개변수
2024.11.03-[FastAPI] 요청 데이터 접근 - request body
이번에는 FastAPI에서 응답 데이터를 다루는 방법에 대해 알아본다.
응답 데이터
FastAPI에서는 경로 데코레이터에 response_model이라는 매개변수를 추가하여 응답 데이터 형식을 지정할 수 있다. 응답 데이터 형식은 request body 형식을 정의했던 것과 동일하게 pydantic BaseModel을 사용한다. 기본적으로는 JSON 형식으로 응답하는 것 같다.
아래 예제는 요청 데이터 형식 그대로 응답하는 코드이다.
from fastapi import FastAPI
from typing import Any
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items/", response_model=Item)
async def create_item(item: Item) -> Any:
return item
경로 데코레이터에 response_model을 추가함으로써 FastAPI는 출력 데이터를 지정한 타입으로 변환하고, 데이터를 검증하고, API 문서에 출력 형식에 대한 내용을 자동으로 반영한다.
response_model_exclude_unset
FastAPI는 응답 데이터를 다룰 때 몇 가지 매개변수룰 추가함으로써 응답 방식을 변경할 수 있는데, 그중 response_model_exclude_unset은 응답 데이터 중 기본값의 응답 여부를 결정한다. response_model_exclude_unset가 True이면 명시적으로 설정하지 않은 데이터는 제외하고, False이면 모든 응답 데이터를 전달한다. response_model_exclude_unset은 기본적으로 False이다.
아래 코드를 예시로 알아보자.
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
@app.post("/items", response_model=Item)
async def create_item(item: Item) -> Any:
return item
예시 코드가 동작하면, 응답 매개변수로 response_model_exclude_unset가 활성화되어 있지 않기 때문에 서버는 항상 기본값을 포함한 응답 데이터를 반환한다.
curl -X POST http://localhost:8000/items \
--header "content-type: application/json;charset=utf-8" \
-d '{"name": "Foo", "price": 45.2}'
하지만 다음과 같이 response_model_exclude_unset을 활성화하면 서버는 명시적으로 설정하지 않은 데이터는 제외한 응답 데이터를 반환한다.
@app.post("/items", response_model=Item, response_model_exclude_unset=True)
async def create_item(item: Item) -> Any:
return item
- 기본값이 있는 데이터에 값을 설정한 경우
이제 응답 데이터 중 기본값이 있는 데이터에 값을 설정해보자.
@app.post("/items", response_model=Item, response_model_exclude_unset=True)
async def create_item(item: Item) -> Any:
item.description = 'response_model_exclude_unset test'
return item
이제는 설정한 값의 데이터를 포함한 응답을 확인할 수 있다.
- 기본값과 동일한 값을 설정한 경우
혹시 기본값과 동일한 값으로 응답 데이터를 설정한 경우에도 FastAPI는 설정한 값을 포함하여 응답 데이터를 전달한다.
@app.post("/items", response_model=Item, response_model_exclude_unset=True)
async def create_item(item: Item) -> Any:
item.description = None
return item
참고로 유사한 매개변수로 아래의 값이 존재한다.
- response_model_exclude_defaults : 응답 데이터 중 기본값과 동일한 값의 응답 여부 결정
- response_model_exclude_none : 응답 데이터 중 None인 값의 응답 여부 결정
참고 문서
https://fastapi.tiangolo.com/ko/tutorial/response-model/
Fast API, Response Model (Output 데이터 형식)