【FastAPI】カスタムレスポンスの追加やドキュメントの記述

FastAPIは、基本的にFastAPI側でよしなに変換してJSON形式で返してくれますが、別のレスポンスが必要な場合があります。例えば

  • テキスト
  • リスト
  • html・xml
  • ファイル

等が挙げられます。

今回はカスタムレスポンスの使い方をご紹介いたします。

この記事のサンプルコード

目次

カスタムレスポンス

カスタムレスポンスを使用する場合にはfastapi.responsesResponseをインポートします。

また、Responseにはサブクラスが用意されており、専用のPlainTextResponseHTMLResponseがなどがあります。

Response

from fastapi import APIRouter
from fastapi.responses import Response

router = APIRouter(
    prefix='/products',
    tags=['products']
)

products = ['water', 'cola', 'coffee']

@router.get('/all')
def get_products_all():
    text_data = " ".join(products)
    return Response(content=text_data, media_type='text/plain')

productsでデータとしてリストを作成しました。

Response(content=text_data, media_type='text/plain')

contentで返すデータを、media_typeで型指定しています。

ステータスコードの付与

ステータスコードの付与も簡単で、status_codeを記入するだけです。

from fastapi import status

~~~

Response(content=text_data, media_type='text/plain', status_code=status.HTTP_200_OK)

HTMLResponse

HTMLも可能です。

jinja2を使用してhtml・cssファイルを配信する際は、下記記事を参照ください。

from fastapi.responses import HTMLResponse

@router. get('/{id}')
def get_product(id: int):
    product = products[id]
    html = f"""
        <html>
            <h2>product is {id}</h2>
        </html>
    """
    return HTMLResponse(content=html, media_type="text/html", status_code=status.HTTP_200_OK)

また、response_classHTMLResponseを指定することも可能です。

@router. get('/{id}', response_class=HTMLResponse)
def get_product(id: int):
    product = products[id]
    html = f"""
        <html>
            <h2>product is {id}</h2>
        </html>
    """
    return html

その他にもPlainTextResponseXmlResponseなどがあります。

ドキュメントへの記述

レスポンスを作成することは出来ましたが、このままだとドキュメントには何も記載が無く、レスポンス例もstringしか記載されていません。

レスポンスに関しての記述を追加してみましょう。

@router.get('/{id}', responses={
    200: {
        "content": {
            "text/html": {
                "example": "<div>product is id</div>"
            }
        },
        "description": "return html object"
    }
})
def get_product(id: int):
    product = products[id]
    html = f"""
        <html>
            <h2>product is {id}</h2>
        </html>
    """
    return HTMLResponse(content=html, media_type="text/html", status_code=status.HTTP_200_OK)

responses引数を追加し、status_codemedia_type ・例や説明を追加できます。

これらはステータスコード毎に記述可能です。

  • description
  • media_type
  • example value

等が変化しています。控え目に言って最強ですね。

この記事のサンプルコード

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる