You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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] *}