FastAPIでレスポンス情報を修正する方法

概要

FastAPIでは、リクエストの処理はパス操作関数内で行います。
パス操作関数の引数には、requestオブジェクトとresponseオブジェクトが渡されます。 これらのオブジェクトを使用して、リクエストに関連するデータの取得やレスポンスの生成などを行います。

ここでは、以下バージョンを使用した、FastAPIでレスポンス情報を修正する方法を説明します。

FastAPI v0.100.0
Python v3.11.4
uvicorn v0.22.0

また、今回作成するコードは全て、GitHub に掲載しています。

レスポンス情報を編集する方法

レスポンスオブジェクトは、クライアントへのレスポンスを構築するために使用されます。 FastAPIのパス操作関数内で利用され、レスポンスのヘッダー、ステータスコード、データなどを設定するために利用されます。

以下のサンプルコードは、FastAPIでレスポンスオブジェクトを理解するための例です。GETリクエストを受け取り、異なる種類のレスポンスを生成して返します。

response.py

from fastapi import FastAPI, Response
from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse

app = FastAPI()

@app.get("/json")
async def json_response():
    # JSONレスポンスの生成
    return JSONResponse(content={"message": "This is a JSON response"})

@app.get("/html")
async def html_response():
    # HTMLレスポンスの生成
    return HTMLResponse(content="<h1>This is an HTML response</h1>")

@app.get("/custom-header")
async def custom_header_response():
    # レスポンスヘッダーの設定
    response = Response(content="This response has a custom header")
    response.headers["Custom-Header"] = "Custom Value"
    return response

@app.get("/status-code")
async def status_code_response():
    # ステータスコードの設定
    response = Response(content="Created", status_code=201)
    return response

@app.get("/redirect")
async def redirect_response():
    # リダイレクトの実行
    return RedirectResponse(url="/json")

@app.get("/error")
async def error_response():
    # エラーレスポンスの生成
    return JSONResponse(content={"error": "An error occurred"}, status_code=500)

解説

  • JSONレスポンスエンドポイント (/json)
@app.get("/json")
async def json_response():
    # JSONレスポンスの生成
    return JSONResponse(content={"message": "This is a JSON response"})

このエンドポイントはJSON形式のレスポンスを返します。具体的には、{“message”: “This is a JSON response”}というJSONオブジェクトをレスポンスとして返します。

  • HTMLレスポンスエンドポイント (/html)
@app.get("/html")
async def html_response():
    # HTMLレスポンスの生成
    return HTMLResponse(content="<h1>This is an HTML response</h1>")

このエンドポイントはHTML形式のレスポンスを返します。具体的には、"

This is an HTML response

“というHTMLをレスポンスとして返します。

  • カスタムヘッダーレスポンスエンドポイント (/custom-header)
@app.get("/custom-header")
async def custom_header_response():
    # レスポンスヘッダーの設定
    response = Response(content="This response has a custom header")
    response.headers["Custom-Header"] = "Custom Value"
    return response

このエンドポイントはカスタムヘッダーを持つレスポンスを返します。具体的には、“Custom-Header"という名前のヘッダーを"Custom Value"という値でレスポンスに追加します。

  • ステータスコードレスポンスエンドポイント (/status-code)
@app.get("/status-code")
async def status_code_response():
    # ステータスコードの設定
    response = Response(content="Created", status_code=201)
    return response

このエンドポイントは201(Created)という特定のステータスコードを持つレスポンスを返します。ステータスコード201は、リソースが正常に作成されたことを示します。

  • リダイレクトレスポンスエンドポイント (/redirect)
@app.get("/redirect")
async def redirect_response():
    # リダイレクトの実行
    return RedirectResponse(url="/json")

このエンドポイントは、アクセスすると”/json"エンドポイントへのリダイレクトを行います。

  • エラーレスポンスエンドポイント (/error)
@app.get("/error")
async def error_response():
    # エラーレスポンスの生成
    return JSONResponse(content={"error": "An error occurred"}, status_code=500)

このエンドポイントは、500(Internal Server Error)というステータスコードとエラーメッセージを持つレスポンスを返します。このエラーメッセージは、{“error”: “An error occurred”}というJSONオブジェクト形式で返されます。

これらのエンドポイントを通じて、FastAPIがさまざまな種類のHTTPレスポンスをどのように処理するかを学ぶことができます。 以下のコマンドでFastAPIアプリケーションを起動しておく必要があります:

uvicorn main:app --reload

テスト

curl -X GET http://localhost:8000/json
curl -X GET http://localhost:8000/html
curl -X GET http://localhost:8000/custom-header
curl -X GET http://localhost:8000/status-code
curl -L -X GET http://localhost:8000/redirect ("-L"フラグを使用してリダイレクトを追跡)
curl -X GET http://localhost:8000/error

このコードでは、パス操作関数内でさまざまな種類のレスポンスを生成しています。
JSONレスポンス、HTMLレスポンス、カスタムヘッダー、ステータスコードなどの機能を示しています。FastAPIの便利な機能を使用して、簡潔かつ柔軟なレスポンスの生成が可能です。

まとめ

レスポンスオブジェクトを使用することで、以下のことが可能になります。

  • レスポンスヘッダーの設定や変更ができます。
  • レスポンスのHTTPステータスコードを設定できます。
  • レスポンスのボディデータを設定できます。JSONオブジェクト、文字列、バイナリデータなどの形式でデータを返すことができます。

レスポンスオブジェクトを使用することで、FastAPIアプリケーション内でレスポンスの生成に関するさまざまな操作を行うことができます。レスポンスオブジェクトには多くのプロパティやメソッドがあり、高度なカスタマイズや制御が可能です。