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.4 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 нет способа заранее знать, что вы собираетесь вернуть.

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