You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.3 KiB

Дополнительные статус коды

По умолчанию FastAPI возвращает ответы, используя JSONResponse, помещая содержимое, которое вы возвращаете из вашей операции пути, внутрь этого JSONResponse.

Он будет использовать код статуса по умолчанию или тот, который вы укажете в вашей операции пути.

Дополнительные статус коды

Если вы хотите возвращать дополнительный статус код помимо основного, вы можете сделать это, возвращая объект Response напрямую, как JSONResponse, и устанавливая нужный статус код напрямую.

Например, скажем, вы хотите создать операцию пути, которая позволяет обновлять элементы и возвращает HTTP-код 200 "OK" при успешном выполнении.

Но вы также хотите, чтобы она принимала новые элементы. И если элемент ранее не существовал, он создаётся, и возвращался HTTP-код 201 "Created".

Чтобы реализовать это, импортируйте JSONResponse и возвращайте ваш контент напрямую, устанавливая нужный status_code:

{* ../../docs_src/additional_status_codes/tutorial001_an_py310.py hl[4,25] *}

/// warning | Внимание

Когда вы возвращаете объект Response напрямую, как в примере выше, он будет возвращён как есть.

Он не будет сериализован при помощи модели и т.д.

Убедитесь, что в нём содержатся именно те данные, которые вы хотите, и что значения являются валидным JSON (если вы используете JSONResponse).

///

/// note | Технические детали

Вы также можете использовать from starlette.responses import JSONResponse.

FastAPI предоставляет тот же starlette.responses через fastapi.responses просто для вашего удобства, как разработчика. Но большинство доступных Response-классов поступают напрямую из Starlette. То же самое касается и status.

///

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

Если вы возвращаете дополнительные коды статусов и ответы напрямую, они не будут включены в схему OpenAPI (документацию API), потому что FastAPI не может заранее знать, что вы собираетесь вернуть.

Но вы можете задокументировать это в вашем коде, используя: Дополнительные ответы в OpenAPI{.internal-link target=_blank}.