Python

[FastAPI] response 형식 지정하기

비번변경 2024. 11. 21. 10:29

개요

아래 글들을 통해 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 데이터 형식)