コンテンツにスキップ

レスポンスステータスコード

レスポンスモデルを指定できるのと同様に、任意の *パス操作* で `status_code` パラメータを使用して、レスポンスに使用される HTTP ステータスコードを宣言することもできます。

  • @app.get()
  • @app.post()
  • @app.put()
  • @app.delete()
  • など
from fastapi import FastAPI

app = FastAPI()


@app.post("/items/", status_code=201)
async def create_item(name: str):
    return {"name": name}

注記

`status_code` は、「デコレータ」メソッド (`get`、`post` など) のパラメータであることに注意してください。すべてのパラメータやボディのように、*パス操作関数* のパラメータではありません。

`status_code` パラメータは、HTTP ステータスコードを表す数値を受け取ります。

情報

`status_code` は、Python の `http.HTTPStatus` などの `IntEnum` を受け取ることもできます。

これは以下のようになります。

  • レスポンスでそのステータスコードを返します。
  • OpenAPI スキーマ(したがって、ユーザーインターフェース)にそれをドキュメント化します。

注記

一部のレスポンスコード (次のセクションを参照) は、レスポンスにボディがないことを示しています。

FastAPI はこれを認識しており、レスポンスボディがないことを示す OpenAPI ドキュメントを作成します。

HTTPステータスコードについて

注記

HTTPステータスコードについてすでに知っている場合は、次のセクションに進んでください。

HTTP では、レスポンスの一部として 3 桁の数値ステータスコードを送信します。

これらのステータスコードには、認識するための名前が関連付けられていますが、重要な部分は数値です。

要するに

  • `100` 以上は「情報」用です。直接使用することはめったにありません。これらのステータスコードを持つレスポンスには、ボディを含めることができません。
  • **`200`** 以上は「成功」レスポンス用です。これらは最もよく使用するものです。
    • `200` はデフォルトのステータスコードであり、すべてが「OK」だったことを意味します。
    • 別の例として、`201`、「作成済み」があります。これは、データベースに新しいレコードを作成した後に一般的に使用されます。
    • 特別なケースは `204`、「コンテンツなし」です。このレスポンスは、クライアントに返すコンテンツがない場合に使用されるため、レスポンスにボディを含めてはなりません。
  • **`300`** 以上は「リダイレクト」用です。これらのステータスコードを持つレスポンスには、ボディが含まれる場合と含まれない場合があります。ただし、`304`、「変更なし」はボディを含めてはなりません。
  • **`400`** 以上は「クライアントエラー」レスポンス用です。これらは、おそらく 2 番目に多く使用するタイプです。
    • 例として、`404` は「見つかりません」レスポンス用です。
    • クライアントからの一般的なエラーの場合は、`400` を使用できます。
  • `500` 以上はサーバーエラー用です。直接使用することはほとんどありません。アプリケーションコードまたはサーバーのどこかの部分で問題が発生した場合、これらのステータスコードのいずれかが自動的に返されます。

ヒント

各ステータスコードの詳細と、どのコードが何のためにあるかについては、MDN の HTTP ステータスコードに関するドキュメント を確認してください。

名前を覚えるためのショートカット

前の例をもう一度見てみましょう

from fastapi import FastAPI

app = FastAPI()


@app.post("/items/", status_code=201)
async def create_item(name: str):
    return {"name": name}

`201` は「作成済み」のステータスコードです。

しかし、これらのコードの意味をそれぞれ覚える必要はありません。

`fastapi.status` の便利な変数を使用できます。

from fastapi import FastAPI, status

app = FastAPI()


@app.post("/items/", status_code=status.HTTP_201_CREATED)
async def create_item(name: str):
    return {"name": name}

これらは単なる便宜上のものです。同じ数値を保持していますが、エディターのオートコンプリートを使用して見つけることができます。

技術詳細

from starlette import status を使用することもできます。

FastAPI は、開発者の便宜のために、starlette.status と同じものを fastapi.status として提供しています。しかし、これは Starlette から直接提供されています。

デフォルトの変更

後ほど、上級ユーザーガイド で、ここで宣言しているデフォルトとは異なるステータスコードを返す方法について説明します。