Skip to content

2. Return a Response Directly


1. Return a Response Directly

  • FastAPI path operation을 만들 때 일반적으로 dict, list, Pydantic 모델, 데이터베이스 모델 등 모든 데이터를 반환할 수 있다.
  • 기본적으로 FastAPI는 jsonable_encoder를 사용하여 해당 반환 값을 JSON으로 자동 변환한다.
  • 그런 다음 클라이언트에게 response를 보내는 데 사용되는 JSONResponse 내부에 해당 JSON과 호환되는 데이터를 넣는다.
  • 하지만 path operation에서 직접 JSONResponse를 반환할 수 있다.


2. Return a Response

  • 어떤 Response 또는 하위 클래스라도 반환할 수 있다.


Note

  • JSONResponseResponse의 하위 클래스이다.


  • 그리고 Response를 반환하면, FastAPI가 직접 전달한다.
  • Pydantic 모델로 데이터 변환을 수행하지 않으며, 내용을 어떤 타입으로도 변환하지 않는다.
  • 이렇게 하면 많은 유연성을 제공받을 수 있다.


3. Using the jsonable_encoder in a Response

  • FastAPI는 반환하는 Response를 변경하지 않으므로, 내용이 준비되어 있는지 확인해야 한다.
  • 예를 들어, Pydantic 모델을 JSON과 호환되는 타입인 dict 타입으로 먼저 변환하지 않으면 JSONResponse에 넣을 수 없다.


  • 이러한 경우 다음과 같이 jsonable_encoder를 사용하여 데이터를 response에 전달하기 전에 변환할 수 있다.


from datetime import datetime
from typing import Optional
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    title: str
    timestamp: datetime
    description: Optional[str] = None

@app.put("/items/{id}")
def update_item(id: str, item: Item):
    json_compatible_item_data = jsonable_encoder(item)

    return JSONResponse(content=json_compatible_item_data)


4. Returning a custom Response

  • 위의 예제는 필요한 모든 부분을 보여 주긴 하지만, 개발자가 항목을 직접 반환할 수 있고, FastAPI가 이를 JSONResponse에 넣어 dict 등으로 변환해야 하므로 그다지 유용하지는 않다.
  • 사용자 지정 response를 반환하는 방법을 살펴보자.


  • 다음과 같이 XML 내용을 Response에 넣어 반환할 수 있다.


from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/legacy/")
def get_legacy_data():
    data = """<?xml version="1.0"?>
    <shampoo>
    <Header>
        Apply shampoo here.
    </Header>
    <Body>
        You'll have to use soap here.
    </Body>
    </shampoo>
    """

    return Response(content=data, media_type="application/xml")


Note

  • Response를 직접 반환하면, 해당 데이터의 유효성 검사나 자동 문서화가 되지는 않는다.

References