Додаткові коди статусу¶
🌐 Переклад ШІ та людьми
Цей переклад виконано ШІ під керівництвом людей. 🤝
Можливі помилки через неправильне розуміння початкового змісту або неприродні формулювання тощо. 🤖
Ви можете покращити цей переклад, допомігши нам краще спрямовувати 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 не має способу заздалегідь знати, що саме ви повернете.
Але ви можете задокументувати це у своєму коді, використовуючи: Додаткові відповіді.