コンテンツにスキップ

レスポンスを直接返す

FastAPI の *パス操作* を作成するとき、通常は任意のデータを返すことができます:dictlist、Pydanticモデル、データベースモデルなど。

デフォルトでは、FastAPIJSON互換エンコーダー で説明されている jsonable_encoder を使用して、その戻り値を自動的にJSONに変換します。

次に、舞台裏では、そのJSON互換データ(例:dict)を JSONResponse の中に配置し、クライアントにレスポンスを送信するために使用します。

しかし、*パス操作* から JSONResponse を直接返すことができます。

たとえば、カスタムヘッダーまたはCookieを返す場合に役立つことがあります。

Response を返す

実際には、任意の Response またはそのサブクラスを返すことができます。

ヒント

JSONResponse 自体は Response のサブクラスです。

Response を返すと、FastAPI はそれを直接渡します。

Pydanticモデルによるデータ変換、コンテンツの型変換などは行いません。

これにより、大きな柔軟性が得られます。任意のデータ型を返し、任意のデータ宣言または検証をオーバーライドするなどができます。

Responsejsonable_encoder を使用する

FastAPI は返された Response に変更を加えないため、コンテンツが準備できていることを確認する必要があります。

たとえば、すべてのデータ型(datetimeUUID など)をJSON互換型に変換せずに、Pydanticモデルを JSONResponse に配置することはできません。

そのような場合は、jsonable_encoder を使用して、レスポンスに渡す前にデータを変換できます

from datetime import datetime
from typing import Union

from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel


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


app = FastAPI()


@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)

「技術詳細」

from starlette.responses import JSONResponse を使用することもできます。

FastAPI は、開発者の便宜のために、starlette.responses と同じ fastapi.responses を提供しています。ただし、使用可能なレスポンスのほとんどはStarletteから直接提供されています。

カスタム Response を返す

上記の例は必要なすべてのパーツを示していますが、まだそれほど役に立ちません。 item を直接返せば、FastAPI がそれを JSONResponse に配置し、dict に変換するなど、すべてデフォルトで行います。

では、カスタムレスポンスを返すためにそれを使用する方法を見てみましょう。

XML レスポンスを返したいとしましょう。

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")

注記

Response を直接返した場合、そのデータは検証、変換(シリアライズ)、および自動的なドキュメント化が行われません。

ただし、OpenAPI における追加レスポンスで説明されているように、ドキュメント化することは可能です。

後のセクションでは、これらのカスタム Response を使用/宣言しながら、データの自動変換、ドキュメント化などを行う方法について説明します。