Перейти до змісту

Повернення Response безпосередньо

🌐 Переклад ШІ та людьми

Цей переклад виконано ШІ під керівництвом людей. 🤝

Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖

Ви можете покращити цей переклад, допомігши нам краще спрямовувати AI LLM.

Англійська версія

Коли ви створюєте операцію шляху FastAPI, зазвичай ви можете повертати з неї будь-які дані: dict, list, модель Pydantic, модель бази даних тощо.

Типово FastAPI автоматично перетворить це значення повернення на JSON, використовуючи jsonable_encoder, описаний у Сумісному з JSON кодері.

Потім, за лаштунками, він помістить ці дані, сумісні з JSON (наприклад, dict), у JSONResponse, який буде використано для надсилання відповіді клієнту.

Але ви можете повертати JSONResponse безпосередньо з ваших операцій шляху.

Це може бути корисним, наприклад, щоб повертати власні заголовки або кукі.

Повернення 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 просто як зручність для вас, розробника. Але більшість доступних Response походять безпосередньо зі 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")

Примітки

Коли ви повертаєте Response безпосередньо, його дані не перевіряються, не перетворюються (серіалізуються) і не документуються автоматично.

Але ви все ще можете задокументувати це, як описано в Додаткових відповідях в OpenAPI.

У подальших розділах ви побачите, як використовувати/оголошувати ці власні Response, водночас зберігаючи автоматичне перетворення даних, документацію тощо.