Перейти к содержанию

Прямое использование Request

До этого вы объявляли нужные части HTTP-запроса вместе с их типами.

Извлекая данные из:

  • пути (как параметров),
  • HTTP-заголовков,
  • Cookie,
  • и т.д.

Тем самым FastAPI валидирует эти данные, преобразует их и автоматически генерирует документацию для вашего API.

Но бывают ситуации, когда нужно обратиться к объекту Request напрямую.

Подробности об объекте Request

Так как под капотом FastAPI — это Starlette с дополнительным слоем инструментов, вы можете при необходимости напрямую использовать объект Request из Starlette.

Это также означает, что если вы получаете данные напрямую из объекта Request (например, читаете тело запроса), то они не будут валидироваться, конвертироваться или документироваться (с OpenAPI, для автоматического пользовательского интерфейса API) средствами FastAPI.

При этом любой другой параметр, объявленный обычным образом (например, тело запроса с Pydantic-моделью), по-прежнему будет валидироваться, конвертироваться, аннотироваться и т.д.

Но есть конкретные случаи, когда полезно получить объект Request.

Используйте объект Request напрямую

Представим, что вы хотите получить IP-адрес/хост клиента внутри вашей функции-обработчика пути.

Для этого нужно обратиться к запросу напрямую.

from fastapi import FastAPI, Request

app = FastAPI()


@app.get("/items/{item_id}")
def read_root(item_id: str, request: Request):
    client_host = request.client.host
    return {"client_host": client_host, "item_id": item_id}

Если объявить параметр функции-обработчика пути с типом Request, FastAPI поймёт, что нужно передать объект Request в этот параметр.

Совет

Обратите внимание, что в этом примере мы объявляем path-параметр вместе с параметром Request.

Таким образом, path-параметр будет извлечён, валидирован, преобразован к указанному типу и задокументирован в OpenAPI.

Точно так же вы можете объявлять любые другие параметры как обычно и, дополнительно, получать Request.

Документация по Request

Подробнее об объекте Request на официальном сайте документации Starlette.

Технические детали

Вы также можете использовать from starlette.requests import Request.

FastAPI предоставляет его напрямую для удобства разработчика, но сам объект приходит из Starlette.