Binary
Чтение тела запроса в виде последовательности байт.
Описание
Binary (MIME-type: application/octet-stream
) — двоичный тип данных.
Rapidy
позволяет извлекать любые данные с content_type
в виде последовательности байт.
Просто укажите аннотацию bytes
или StreamReader
.
Зачем это нужно?
Это полезно, если нужно явно ограничить тип принимаемых данных и затем обработать их в двоичном виде.
Есть только два типа данных, которые можно извлекать без учета content_type
: bytes
и StreamReader
.
bytes
from rapidy.http import post, Body, ContentType
@post('/')
async def handler(
user_data: bytes = Body(),
# or use any content_type
user_data: bytes = Body(content_type=ContentType.stream),
# also you can use pydantic validation
user_data: bytes = Body(min_length=1),
) -> ...:
StreamReader
Подробнее об объекте StreamReader
можно узнать здесь.
from rapidy import StreamReader
from rapidy.http import post, Body
@post('/')
async def handler(
user_data: StreamReader = Body(),
) -> ...:
Извлечение без валидации
Эти способы не рекомендуются.
Если отключить валидацию, параметр вернет базовую структуру aiohttp
:
Body(content_type=ContentType.stream)
→bytes
Валидация pydantic
для StreamReader
не работает.
Способы отключения валидации
Отключение валидации с validate=False
Установите Body(validate=False)
.
Отключение через Any
Отключение типизации
Если не указывать тип, по умолчанию будет использован Any
.
Значения по умолчанию
Если HTTP-запрос не содержит тела, параметр получит указанное значение по умолчанию (если оно задано).
Примеры использования
Указано значение по умолчанию
@post('/')
async def handler(
data: bytes = Body(b'some_bytes', content_type=ContentType.stream),
# or
data: bytes = Body(default_factory=lambda: b'some_bytes', content_type=ContentType.stream),
) -> ...:
Опциональное тело запроса
@post('/')
async def handler(
data: bytes | None = Body(content_type=ContentType.stream),
# or
data: Optional[bytes] = Body(content_type=ContentType.stream),
# or
data: Union[bytes, None] = Body(content_type=ContentType.stream),
) -> ...:
Значение по умолчанию для StreamReader
задать нельзя.
Если попытаться установить default
или default_factory
для StreamReader
, будет вызвана ошибка ParameterCannotUseDefaultError
.
Как извлекаются сырые данные
Rapidy
использует встроенные механизмы aiohttp
.
Подробнее о aiohttp.Request
и методах извлечения данных можно прочитать здесь.
bytes
Rapidy
вызывает метод read
объекта Request
, а затем передает полученные данные в pydantic
для валидации.
Как работает извлечение в Rapidy
StreamReader
Rapidy
использует атрибут content
объекта Request
и передает его напрямую в обработчик запроса, минуя валидацию pydantic
.