|
| 1 | +# Возврат ответа напрямую |
| 2 | + |
| 3 | +Когда вы создаёте **FastAPI** *операцию пути*, вы можете возвращать из неё любые данные: `dict`, `list`, Pydantic-модель, модель базы данных и т.д. |
| 4 | + |
| 5 | +По умолчанию **FastAPI** автоматически преобразует возвращаемое значение в JSON с помощью `jsonable_encoder`, как описано в [JSON кодировщик](../tutorial/encoder.md){.internal-link target=_blank}. |
| 6 | + |
| 7 | +Затем "под капотом" эти данные, совместимые с JSON (например `dict`), помещаются в `JSONResponse`, который используется для отправки ответа клиенту. |
| 8 | + |
| 9 | +Но вы можете возвращать `JSONResponse` напрямую из ваших *операций пути*. |
| 10 | + |
| 11 | +Это может быть полезно, например, если нужно вернуть пользовательские заголовки или куки. |
| 12 | + |
| 13 | +## Возврат `Response` |
| 14 | + |
| 15 | +На самом деле, вы можете возвращать любой объект `Response` или его подкласс. |
| 16 | + |
| 17 | +/// tip | Подсказка |
| 18 | + |
| 19 | +`JSONResponse` сам по себе является подклассом `Response`. |
| 20 | + |
| 21 | +/// |
| 22 | + |
| 23 | +И когда вы возвращаете `Response`, **FastAPI** передаст его напрямую. |
| 24 | + |
| 25 | +Это не приведет к преобразованию данных с помощью Pydantic-моделей, содержимое не будет преобразовано в какой-либо тип и т.д. |
| 26 | + |
| 27 | +Это даёт вам большую гибкость. Вы можете возвращать любые типы данных, переопределять любые объявления или валидацию данных и т.д. |
| 28 | + |
| 29 | +## Использование `jsonable_encoder` в `Response` |
| 30 | + |
| 31 | +Поскольку **FastAPI** не изменяет объект `Response`, который вы возвращаете, вы должны убедиться, что его содержимое готово к отправке. |
| 32 | + |
| 33 | +Например, вы не можете поместить Pydantic-модель в `JSONResponse`, не преобразовав её сначала в `dict` с помощью преобразования всех типов данных (таких как `datetime`, `UUID` и т.д.) в совместимые с JSON типы. |
| 34 | + |
| 35 | +В таких случаях вы можете использовать `jsonable_encoder` для преобразования данных перед передачей их в ответ: |
| 36 | + |
| 37 | +{* ../../docs_src/response_directly/tutorial001.py hl[6:7,21:22] *} |
| 38 | + |
| 39 | +/// note | Технические детали |
| 40 | + |
| 41 | +Вы также можете использовать `from starlette.responses import JSONResponse`. |
| 42 | + |
| 43 | +**FastAPI** предоставляет `starlette.responses` через `fastapi.responses` просто для вашего удобства, как разработчика. Но большинство доступных Response-классов поступают напрямую из Starlette. |
| 44 | + |
| 45 | +/// |
| 46 | + |
| 47 | +## Возврат пользовательского `Response` |
| 48 | + |
| 49 | +Пример выше показывает все необходимые части, но он пока не очень полезен, так как вы могли бы просто вернуть `item` напрямую, и **FastAPI** поместил бы его в `JSONResponse`, преобразовав в `dict` и т.д. Всё это происходит по умолчанию. |
| 50 | + |
| 51 | +Теперь давайте посмотрим, как можно использовать это для возврата пользовательского ответа. |
| 52 | + |
| 53 | +Допустим, вы хотите вернуть ответ в формате <a href="https://en.wikipedia.org/wiki/XML" class="external-link" target="_blank">XML</a>. |
| 54 | + |
| 55 | +Вы можете поместить ваш XML-контент в строку, поместить её в `Response` и вернуть: |
| 56 | + |
| 57 | +{* ../../docs_src/response_directly/tutorial002.py hl[1,18] *} |
| 58 | + |
| 59 | +## Примечания |
| 60 | + |
| 61 | +Когда вы возвращаете объект `Response` напрямую, его данные не валидируются, не преобразуются (не сериализуются) и не документируются автоматически. |
| 62 | + |
| 63 | +Но вы всё равно можете задокументировать это, как описано в [Дополнительные ответы в OpenAPI](additional-responses.md){.internal-link target=_blank}. |
| 64 | + |
| 65 | +В следующих разделах вы увидите, как использовать/объявлять такие кастомные `Response`, при этом сохраняя автоматическое преобразование данных, документацию и т.д. |
0 commit comments