コンテンツへスキップ

レスポンスを直接返す

FastAPIパス操作を作成するときは、通常、dictlist、Pydanticモデル、データベースモデルなど、あらゆるデータを返すことができます。

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

その後、舞台裏で、そのJSON互換データ(例:dict)をJSONResponseに入れ、それを使用してクライアントに応答を送信します。

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

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

Responseを返す

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

ヒント

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

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

Pydanticモデルとのデータ変換を行わず、コンテンツをいかなる型にも変換しません。

これにより、非常に柔軟性が高まります。任意のデータ型を返し、任意のデータ宣言や検証を上書きできます。

Responsejsonable_encoderを使用する

FastAPIはあなたが返すResponseに一切変更を加えないため、そのコンテンツがそれに適合していることを確認する必要があります。

たとえば、PydanticモデルをJSONResponseに入れる場合、まず、すべてのデータ型(datetimeUUIDなど)をJSON互換型に変換したdictに変換する必要があります。

このような場合、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を使用/宣言する方法を確認できます。