Прямое использование 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.