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.7 KiB

JSON з байтами як Base64

Якщо ваш застосунок має отримувати і надсилати дані JSON, але потрібно включати туди двійкові дані, ви можете кодувати їх як base64.

Base64 проти файлів

Насамперед розгляньте, чи можете ви використати Файли запиту для завантаження двійкових даних і Користувацька відповідь - 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:

Ви можете надіслати запит так:

{
    "description": "Some data",
    "data": "aGVsbG8="
}

/// tip | Порада

aGVsbG8= - це кодування base64 для hello.

///

Після цього Pydantic декодує строку base64 і надасть вам початкові байти в полі моделі data.

Ви отримаєте відповідь приблизно таку:

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