コンテンツへスキップ

ヘッダーパラメータ

QueryPathCookie パラメータを定義するのと同じ方法で、ヘッダーパラメータを定義できます。

Header のインポート

まず Header をインポートします。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}
🤓 その他のバージョンとバリアント
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: str | None = Header(default=None)):
    return {"User-Agent": user_agent}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Union[str, None] = Header(default=None)):
    return {"User-Agent": user_agent}

Header パラメータの宣言

次に、PathQueryCookie と同じ構造を使用してヘッダーパラメータを宣言します。

デフォルト値、およびすべての追加の検証またはアノテーションパラメータを定義できます。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}
🤓 その他のバージョンとバリアント
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: str | None = Header(default=None)):
    return {"User-Agent": user_agent}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Union[str, None] = Header(default=None)):
    return {"User-Agent": user_agent}

技術的な詳細

HeaderPathQueryCookie の「姉妹」クラスです。また、同じ共通の Param クラスを継承しています。

ただし、fastapi から QueryPathHeader などをインポートするとき、それらは実際には特殊なクラスを返す関数であることを覚えておいてください。

情報

ヘッダーを宣言するには Header を使用する必要があります。そうしないと、パラメータがクエリパラメータとして解釈されます。

自動変換

Header は、PathQueryCookie が提供するものに加えて、少し余分な機能を持っています。

ほとんどの標準ヘッダーは、「ハイフン」文字(「マイナス記号」とも呼ばれる (-))で区切られています。

しかし、user-agent のような変数は Python では無効です。

したがって、デフォルトでは、Header は、ヘッダーを抽出および文書化するために、パラメータ名の文字をアンダースコア (_) からハイフン (-) に変換します。

また、HTTP ヘッダーは大文字と小文字を区別しないため、標準的な Python スタイル(「snake_case」とも呼ばれる)で宣言できます。

したがって、User_Agent のように最初の文字を大文字にする必要なく、Python コードで通常どおり user_agent を使用できます。

何らかの理由でアンダースコアからハイフンへの自動変換を無効にする必要がある場合は、Header のパラメータ convert_underscoresFalse に設定します。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[str | None, Header(convert_underscores=False)] = None,
):
    return {"strange_header": strange_header}
🤓 その他のバージョンとバリアント
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[
        Union[str, None], Header(convert_underscores=False)
    ] = None,
):
    return {"strange_header": strange_header}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[
        Union[str, None], Header(convert_underscores=False)
    ] = None,
):
    return {"strange_header": strange_header}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: str | None = Header(default=None, convert_underscores=False),
):
    return {"strange_header": strange_header}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Union[str, None] = Header(default=None, convert_underscores=False),
):
    return {"strange_header": strange_header}

警告

convert_underscoresFalse に設定する前に、一部の HTTP プロキシおよびサーバーではアンダースコアを含むヘッダーの使用が許可されていないことに注意してください。

重複ヘッダー

重複するヘッダーを受け取る可能性があります。つまり、同じヘッダーに複数の値があるということです。

型宣言でリストを使用して、これらのケースを定義できます。

重複するヘッダーからのすべての値は、Python の list として受け取ります。

たとえば、複数回出現する可能性のある X-Token ヘッダーを宣言するには、次のように記述できます。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):
    return {"X-Token values": x_token}
🤓 その他のバージョンとバリアント
from typing import Annotated, List, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[Union[List[str], None], Header()] = None):
    return {"X-Token values": x_token}
from typing import List, Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[Union[List[str], None], Header()] = None):
    return {"X-Token values": x_token}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: list[str] | None = Header(default=None)):
    return {"X-Token values": x_token}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Union[list[str], None] = Header(default=None)):
    return {"X-Token values": x_token}

ヒント

可能であれば`Annotated`バージョンを使用することをお勧めします。

from typing import List, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Union[List[str], None] = Header(default=None)):
    return {"X-Token values": x_token}

次のような2つのHTTPヘッダーを送信してそのパス操作と通信した場合

X-Token: foo
X-Token: bar

応答は次のようになります。

{
    "X-Token values": [
        "bar",
        "foo"
    ]
}

まとめ

QueryPathCookie と同じ共通パターンを使用して、Header でヘッダーを宣言します。

変数のアンダースコアについて心配する必要はありません。FastAPIが変換を処理します。