コンテンツにスキップ

レスポンス - ステータスコードの変更

🌐 AI と人間による翻訳

この翻訳は、人間のガイドに基づいて AI によって作成されました。🤝

原文の意図を取り違えていたり、不自然な表現になっている可能性があります。🤖

AI LLM をより適切に誘導するのを手伝う ことで、この翻訳を改善できます。

英語版

すでに、デフォルトのレスポンスのステータスコードを設定できることをご存知かもしれません。

しかし場合によっては、デフォルトとは異なるステータスコードを返す必要があります。

ユースケース

たとえば、デフォルトでは HTTP ステータスコード "OK" 200 を返したいとします。

しかし、データが存在しなければそれを作成し、HTTP ステータスコード "CREATED" 201 を返したい。

それでも、返すデータは response_model でフィルタ・変換できるようにしておきたい。

そのような場合は Response パラメータを使えます。

Response パラメータを使う

path operation 関数で Response 型のパラメータを宣言できます(Cookie やヘッダーと同様です)。

そして、その一時的なレスポンスオブジェクトに status_code を設定できます。

from fastapi import FastAPI, Response, status

app = FastAPI()

tasks = {"foo": "Listen to the Bar Fighters"}


@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
    if task_id not in tasks:
        tasks[task_id] = "This didn't exist before"
        response.status_code = status.HTTP_201_CREATED
    return tasks[task_id]
🤓 Other versions and variants
from fastapi import FastAPI, Response, status

app = FastAPI()

tasks = {"foo": "Listen to the Bar Fighters"}


@app.put("/get-or-create-task/{task_id}", status_code=200)
def get_or_create_task(task_id: str, response: Response):
    if task_id not in tasks:
        tasks[task_id] = "This didn't exist before"
        response.status_code = status.HTTP_201_CREATED
    return tasks[task_id]

その後は通常どおり、必要な任意のオブジェクト(dict、データベースモデルなど)を返せます。

そして response_model を宣言していれば、返したオブジェクトのフィルタと変換には引き続きそれが使われます。

FastAPI はその一時的なレスポンスからステータスコード(および Cookie とヘッダー)を取り出し、response_model によってフィルタ済みの返却値を含む最終的なレスポンスに反映します。

また、Response パラメータは依存関係内に宣言してステータスコードを設定することもできます。ただし、最後に設定されたものが優先される点に注意してください。