Заголовки запроса и cookie в FastAPI

FastAPI предоставляетHeaderиCookieТип, используемый для получения данных из заголовков HTTP-запроса и Cookie.


Параметр заголовка запроса

ИспользованиеHeaderОбъявление параметров заголовка запроса:

Пример

from typing import Annotated
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    # Получение заголовка запроса User-Agent
    user_agent: Annotated[str | None, Header()] = None,
):
    return {"User-Agent": user_agent}

Посетитеhttp://127.0.0.1:8000/items/Возвращаемый JSON содержит информацию User-Agent браузера.


Автоматическое преобразование заголовков запроса

Имена полей в HTTP-заголовках запроса используют дефисы (например,X-Token), тогда как имена переменных Python не могут содержать дефисы. FastAPI автоматически выполняет преобразование:

Пример

from typing import Annotated
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    # В именах переменных Python используются подчёркивания, FastAPI автоматически преобразует в заголовок запроса X-Token
    x_token: Annotated[list[str] | None, Header()] = Отсутствует,
):
    return {"X-Token values": x_token}

Правила преобразования:

Имена переменных PythonЗаголовки HTTP-запросаОписание
x_tokenX-TokenСимволы подчёркивания автоматически преобразуются в дефисы
user_agentUser-AgentТо же, что выше
content_typeContent-TypeТо же, что выше

FastAPI автоматически преобразует символы подчёркивания в именах переменных_Преобразовать в дефисы-чтобы соответствовать заголовкам запроса. Если вам нужно отключить это преобразование, установитеHeader(convert_underscores=False)。


Получение дублирующихся заголовков запроса

Некоторые заголовки запроса могут появляться несколько раз (например,Set-Cookie), используйтеlistПринятие типов:

Пример

from typing import Annotated
from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    # Получение нескольких заголовков X-Token
    x_token: Annotated[list[str] | None, Header()] = Отсутствует,
):
    return {"X-Token values": x_token}

Пример запроса:

GET /items/ HTTP/1.1
X-Token: foo
X-Token: bar

Ответ:{"X-Token values": ["foo", "bar"]}


Параметры Cookie

ИспользованиеCookieОбъявление параметров Cookie:

Пример

from typing import Annotated
from fastapi import FastAPI, Cookie

app = FastAPI()


@app.get("/items/")
async def read_items(
    # Получить cookie с именем session_token
    session_token: Annotated[str | None, Cookie()] = None,
):
    return {"session_token": session_token}

Совместное использование заголовков запроса и Cookies

Вы можете получить как заголовки запроса, так и Cookies в одном маршруте:

Пример

from typing import Annotated
from fastapi import FastAPI, Header, Cookie

app = FastAPI()


@app.get("/items/")
async def read_items(
    user_agent: Annotated[str | None, Header()] = None,
    session_token: Annotated[str | None, Cookie()] = None,
    ads_id: Annotated[str | None, Cookie()] = None,
):
    return {
        "User-Agent": user_agent,
        "Session-Token": session_token,
        "Ads-ID": ads_id,
    }


Итог

  • ИспользованиеHeaderПолучение параметров заголовка HTTP-запроса
  • ИспользованиеCookieПолучение параметров Cookie
  • FastAPI автоматически преобразует символы подчёркивания в именах переменных Python в дефисы в заголовках запроса
  • Использованиеlist[str]Получение дублирующихся заголовков запроса
  • Параметры заголовков запроса и Cookie поддерживают те же правила валидации, что и query-параметры
Другие расширения