Повернення Response безпосередньо¶
🌐 Переклад ШІ та людьми
Цей переклад виконано ШІ під керівництвом людей. 🤝
Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖
Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.
Коли ви створюєте операцію шляху FastAPI, зазвичай ви можете повертати з неї будь-які дані: dict, list, модель Pydantic, модель бази даних тощо.
Якщо ви оголосите Модель відповіді, FastAPI використає її, щоб серіалізувати дані у JSON за допомогою Pydantic.
Якщо ви не оголошуєте модель відповіді, FastAPI використає jsonable_encoder, описаний у Сумісному з JSON кодері, і помістить результат у JSONResponse.
Ви також можете створити JSONResponse безпосередньо і повернути його.
Порада
Зазвичай ви отримаєте значно кращу продуктивність, використовуючи Модель відповіді, ніж повертаючи JSONResponse безпосередньо, адже так дані серіалізуються Pydantic на Rust.
Повернення Response¶
Ви можете повертати Response або будь-який його підклас.
Інформація
JSONResponse сам є підкласом Response.
І коли ви повертаєте Response, FastAPI передасть його безпосередньо.
Він не виконуватиме жодних перетворень даних за допомогою моделей Pydantic, не перетворюватиме вміст на будь-який тип тощо.
Це дає вам багато гнучкості. Ви можете повертати будь-які типи даних, переписувати будь-які оголошення або перевірки даних тощо.
Це також покладає на вас багато відповідальності. Ви маєте переконатися, що дані, які ви повертаєте, коректні, у правильному форматі, можуть бути серіалізовані тощо.
Використання jsonable_encoder у Response¶
Оскільки FastAPI не вносить змін у Response, який ви повертаєте, вам потрібно впевнитися, що його вміст готовий.
Наприклад, ви не можете помістити модель Pydantic у JSONResponse, не перетворивши її спочатку на dict з усіма типами даних (як-от datetime, UUID тощо), перетвореними на типи, сумісні з JSON.
Для таких випадків ви можете використати jsonable_encoder, щоб перетворити ваші дані перед тим, як передати їх у відповідь:
from datetime import datetime
from fastapi import FastAPI
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse
from pydantic import BaseModel
class Item(BaseModel):
title: str
timestamp: datetime
description: str | None = None
app = FastAPI()
@app.put("/items/{id}")
def update_item(id: str, item: Item):
json_compatible_item_data = jsonable_encoder(item)
return JSONResponse(content=json_compatible_item_data)
Технічні деталі
Ви також можете використати from starlette.responses import JSONResponse.
FastAPI надає ті самі starlette.responses як fastapi.responses просто як зручність для вас, розробника. Але більшість доступних відповідей походять безпосередньо зі Starlette.
Повернення власного Response¶
Наведений вище приклад показує всі необхідні частини, але він ще не дуже корисний, адже ви могли просто повернути item безпосередньо, і FastAPI помістив би його у JSONResponse, перетворивши на dict тощо. Усе це відбувається за замовчуванням.
Тепер подивімося, як це використати, щоб повернути власну відповідь.
Припустімо, ви хочете повернути відповідь XML.
Ви можете помістити свій вміст XML у строку, помістити це в Response і повернути:
from fastapi import FastAPI, Response
app = FastAPI()
@app.get("/legacy/")
def get_legacy_data():
data = """<?xml version="1.0"?>
<shampoo>
<Header>
Apply shampoo here.
</Header>
<Body>
You'll have to use soap here.
</Body>
</shampoo>
"""
return Response(content=data, media_type="application/xml")
Як працює модель відповіді¶
Коли ви оголошуєте Модель відповіді - Тип, що повертається в операції шляху, FastAPI використає її, щоб серіалізувати дані у JSON за допомогою Pydantic.
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
description: str | None = None
price: float
tax: float | None = None
tags: list[str] = []
@app.post("/items/")
async def create_item(item: Item) -> Item:
return item
@app.get("/items/")
async def read_items() -> list[Item]:
return [
Item(name="Portal Gun", price=42.0),
Item(name="Plumbus", price=32.0),
]
Оскільки це відбувається на боці Rust, продуктивність буде значно кращою, ніж якби це робилося звичайним Python і класом JSONResponse.
Коли використовується response_model або тип, що повертається, FastAPI не використовуватиме jsonable_encoder для перетворення даних (що було б повільніше) і не використовуватиме клас JSONResponse.
Натомість воно бере байти JSON, згенеровані Pydantic за допомогою моделі відповіді (або типу, що повертається), і повертає Response з відповідним медіа-типом для JSON (application/json) безпосередньо.
Примітки¶
Коли ви повертаєте Response безпосередньо, його дані не перевіряються, не перетворюються (серіалізуються) і не документуються автоматично.
Але ви все ще можете задокументувати це, як описано в Додаткових відповідях в OpenAPI.
У подальших розділах ви побачите, як використовувати/оголошувати ці власні Response, водночас зберігаючи автоматичне перетворення даних, документацію тощо.