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
JSONResponse
는Response
의 하위 클래스이다.
- 그리고
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
를 직접 반환하면, 해당 데이터의 유효성 검사나 자동 문서화가 되지는 않는다.