レスポンスを直接返す¶
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
に変更を加えないため、コンテンツが準備できていることを確認する必要があります。
たとえば、すべてのデータ型(datetime
、UUID
など)を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
を使用/宣言しながら、データの自動変換、ドキュメント化などを行う方法について説明します。