レスポンスを直接返す¶
FastAPIのパス操作を作成するときは、通常、dict
、list
、Pydanticモデル、データベースモデルなど、あらゆるデータを返すことができます。
デフォルトでは、FastAPIはJSON互換エンコーダーで説明されているjsonable_encoder
を使用して、その戻り値を自動的にJSONに変換します。
その後、舞台裏で、そのJSON互換データ(例:dict
)をJSONResponse
に入れ、それを使用してクライアントに応答を送信します。
しかし、パス操作からJSONResponse
を直接返すこともできます。
これは、たとえば、カスタムヘッダーやCookieを返すのに役立つ場合があります。
Response
を返す¶
実際、Response
またはそのサブクラスを返すことができます。
ヒント
JSONResponse
自体はResponse
のサブクラスです。
そして、Response
を返すと、FastAPIはそれを直接渡します。
Pydanticモデルとのデータ変換を行わず、コンテンツをいかなる型にも変換しません。
これにより、非常に柔軟性が高まります。任意のデータ型を返し、任意のデータ宣言や検証を上書きできます。
Response
でjsonable_encoder
を使用する¶
FastAPIはあなたが返すResponse
に一切変更を加えないため、そのコンテンツがそれに適合していることを確認する必要があります。
たとえば、PydanticモデルをJSONResponse
に入れる場合、まず、すべてのデータ型(datetime
、UUID
など)を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
を使用/宣言する方法を確認できます。