3.8 KiB
JSON с байтами в Base64
Если вашему приложению нужно принимать и отправлять JSON-данные, но при этом необходимо включать в них бинарные данные, вы можете кодировать их в base64.
Base64 и файлы
Сначала рассмотрите возможность использовать Файлы в запросе для загрузки бинарных данных и Пользовательский HTTP-ответ — FileResponse для отправки бинарных данных вместо кодирования их в JSON.
JSON может содержать только строки в кодировке UTF-8, поэтому он не может содержать «сырые» байты.
Base64 может кодировать бинарные данные в строки, но для этого используется больше символов, чем в исходных бинарных данных, поэтому обычно это менее эффективно, чем обычные файлы.
Используйте base64 только если вам действительно нужно включать бинарные данные в JSON и вы не можете использовать файлы для этого.
Pydantic bytes
Вы можете объявить Pydantic-модель с полями bytes, а затем использовать val_json_bytes в конфиге модели, чтобы указать использовать base64 для валидации входящих JSON-данных; как часть этой валидации строка base64 будет декодирована в байты.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}
Если вы откроете /docs, вы увидите, что поле data ожидает байты, закодированные в base64:
Вы можете отправить такой HTTP-запрос:
{
"description": "Some data",
"data": "aGVsbG8="
}
/// tip | Совет
aGVsbG8= — это base64-кодирование строки hello.
///
Затем Pydantic декодирует строку base64 и передаст вам исходные байты в поле data модели.
Вы получите такой HTTP-ответ:
{
"description": "Some data",
"content": "hello"
}
Pydantic bytes для выходных данных
Вы также можете использовать поля bytes с ser_json_bytes в конфиге модели для выходных данных, и Pydantic будет сериализовать байты в base64 при формировании JSON-ответа.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}
Pydantic bytes для входных и выходных данных
И, конечно, вы можете использовать одну и ту же модель, настроенную на использование base64, чтобы обрабатывать и входящие данные (валидация) с val_json_bytes, и исходящие данные (сериализация) с ser_json_bytes при приеме и отправке JSON-данных.
{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}