6.7 KiB
Повернення Response безпосередньо
Коли ви створюєте операцію шляху FastAPI, зазвичай ви можете повертати з неї будь-які дані: dict, list, модель Pydantic, модель бази даних тощо.
Якщо ви оголосите Модель відповіді, FastAPI використає її, щоб серіалізувати дані у JSON за допомогою Pydantic.
Якщо ви не оголошуєте модель відповіді, FastAPI використає jsonable_encoder, описаний у Сумісному з JSON кодері, і помістить результат у JSONResponse.
Ви також можете створити JSONResponse безпосередньо і повернути його.
/// tip | Порада
Зазвичай ви отримаєте значно кращу продуктивність, використовуючи Модель відповіді, ніж повертаючи JSONResponse безпосередньо, адже так дані серіалізуються Pydantic на Rust.
///
Повернення Response
Ви можете повертати Response або будь-який його підклас.
/// info | Інформація
JSONResponse сам є підкласом Response.
///
І коли ви повертаєте Response, FastAPI передасть його безпосередньо.
Він не виконуватиме жодних перетворень даних за допомогою моделей Pydantic, не перетворюватиме вміст на будь-який тип тощо.
Це дає вам багато гнучкості. Ви можете повертати будь-які типи даних, переписувати будь-які оголошення або перевірки даних тощо.
Це також покладає на вас багато відповідальності. Ви маєте переконатися, що дані, які ви повертаєте, коректні, у правильному форматі, можуть бути серіалізовані тощо.
Використання jsonable_encoder у Response
Оскільки FastAPI не вносить змін у Response, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий.
Наприклад, ви не можете помістити модель Pydantic у JSONResponse, не перетворивши її спочатку на dict з усіма типами даних (як-от datetime, UUID тощо), перетвореними на типи, сумісні з JSON.
Для таких випадків ви можете використати jsonable_encoder, щоб перетворити ваші дані перед тим, як передати їх у відповідь:
{* ../../docs_src/response_directly/tutorial001_py310.py hl[5:6,20:21] *}
/// note | Технічні деталі
Ви також можете використати from starlette.responses import JSONResponse.
FastAPI надає ті самі starlette.responses як fastapi.responses просто як зручність для вас, розробника. Але більшість доступних відповідей походять безпосередньо зі Starlette.
///
Повернення власного Response
Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути item безпосередньо, і FastAPI помістив би його у JSONResponse, перетворивши на dict тощо. Усе це відбувається за замовчуванням.
Тепер подивімося, як це використати, щоб повернути власну відповідь.
Припустімо, ви хочете повернути відповідь XML.
Ви можете помістити свій вміст XML у строку, помістити це в Response і повернути:
{* ../../docs_src/response_directly/tutorial002_py310.py hl[1,18] *}
Як працює модель відповіді
Коли ви оголошуєте Модель відповіді - Тип, що повертається в операції шляху, FastAPI використає її, щоб серіалізувати дані у JSON за допомогою Pydantic.
{* ../../docs_src/response_model/tutorial001_01_py310.py hl[16,21] *}
Оскільки це відбувається на боці Rust, продуктивність буде значно кращою, ніж якби це робилося звичайним Python і класом JSONResponse.
Коли використовується response_model або тип, що повертається, FastAPI не використовуватиме jsonable_encoder для перетворення даних (що було б повільніше) і не використовуватиме клас JSONResponse.
Натомість воно бере байти JSON, згенеровані Pydantic за допомогою моделі відповіді (або типу, що повертається), і повертає Response з відповідним медіа-типом для JSON (application/json) безпосередньо.
Примітки
Коли ви повертаєте Response безпосередньо, його дані не перевіряються, не перетворюються (серіалізуються) і не документуються автоматично.
Але ви все ще можете задокументувати це, як описано в Додаткових відповідях в OpenAPI.
У подальших розділах ви побачите, як використовувати/оголошувати ці власні Response, водночас зберігаючи автоматичне перетворення даних, документацію тощо.