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

Додаткові коди статусу

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

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

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

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

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

За замовчуванням FastAPI повертатиме відповіді за допомогою JSONResponse, поміщаючи вміст, який ви повертаєте з вашої операції шляху, у цей JSONResponse.

Він використовуватиме код статусу за замовчуванням або той, який ви встановите у своїй операції шляху.

Додаткові коди статусу

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

Наприклад, припустімо, ви хочете мати операцію шляху, яка дозволяє оновлювати предмети та повертає код статусу HTTP 200 «OK» у разі успіху.

Але ви також хочете приймати нові предмети. І коли таких предметів раніше не існувало, операція створює їх і повертає код статусу HTTP 201 «Created».

Щоб це реалізувати, імпортуйте JSONResponse і поверніть ваш вміст безпосередньо там, встановивши потрібний status_code:

from typing import Annotated

from fastapi import Body, FastAPI, status
from fastapi.responses import JSONResponse

app = FastAPI()

items = {"foo": {"name": "Fighters", "size": 6}, "bar": {"name": "Tenders", "size": 3}}


@app.put("/items/{item_id}")
async def upsert_item(
    item_id: str,
    name: Annotated[str | None, Body()] = None,
    size: Annotated[int | None, Body()] = None,
):
    if item_id in items:
        item = items[item_id]
        item["name"] = name
        item["size"] = size
        return item
    else:
        item = {"name": name, "size": size}
        items[item_id] = item
        return JSONResponse(status_code=status.HTTP_201_CREATED, content=item)
🤓 Other versions and variants

Tip

Prefer to use the Annotated version if possible.

from fastapi import Body, FastAPI, status
from fastapi.responses import JSONResponse

app = FastAPI()

items = {"foo": {"name": "Fighters", "size": 6}, "bar": {"name": "Tenders", "size": 3}}


@app.put("/items/{item_id}")
async def upsert_item(
    item_id: str,
    name: str | None = Body(default=None),
    size: int | None = Body(default=None),
):
    if item_id in items:
        item = items[item_id]
        item["name"] = name
        item["size"] = size
        return item
    else:
        item = {"name": name, "size": size}
        items[item_id] = item
        return JSONResponse(status_code=status.HTTP_201_CREATED, content=item)

Попередження

Коли ви повертаєте Response безпосередньо, як у прикладі вище, він і буде повернений безпосередньо.

Він не буде серіалізований за допомогою моделі тощо.

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

Технічні деталі

Ви також можете використати from starlette.responses import JSONResponse.

FastAPI надає ті самі starlette.responses як fastapi.responses просто для вашої зручності як розробника. Але більшість доступних відповідей надходить безпосередньо зі Starlette. Те саме і зі status.

OpenAPI і документація API

Якщо ви повертаєте додаткові коди статусу та відповіді безпосередньо, вони не будуть включені до схеми OpenAPI (документації API), адже FastAPI не має способу заздалегідь знати, що саме ви повернете.

Але ви можете задокументувати це у своєму коді, використовуючи: Додаткові відповіді.