Какие типы ответов можно возвращать в эндпоинтах FastAPI

Ответ

FastAPI предоставляет гибкие возможности для возврата различных типов ответов, автоматически выполняя сериализацию данных и установку корректного `Content-Type` заголовка. Основные типы возвращаемых данных: 1. **Модели Pydantic** Это основной и рекомендуемый способ. FastAPI автоматически преобразует модель в JSON, валидирует данные ответа и генерирует OpenAPI схему. ```python from pydantic import BaseModel class Item(BaseModel): name: str price: float @app.get("/items/1", response_model=Item) def get_item(): return Item(name="My Item", price=10.5) ``` 2. **Словарь (`dict`) или список (`list`)** Любой `dict` или `list` будет автоматически сериализован в JSON. ```python @app.get("/info") def get_info(): return {"version": "1.0", "status": "ok"} ``` 3. **Объекты `Response`** Для полного контроля над ответом (статус-код, заголовки, cookies) можно напрямую вернуть экземпляр класса `Response` или его наследников. ```python from fastapi import Response @app.get("/legacy") def get_legacy_data(): data = "some_xml" return Response(content=data, media_type="application/xml") ``` 4. **Специализированные классы `Response`** FastAPI предоставляет готовые классы для распространенных задач: * `JSONResponse`: для явного возврата JSON с кастомными заголовками. * `HTMLResponse`: для возврата HTML-страниц. * `PlainTextResponse`: для простого текста. * `RedirectResponse`: для выполнения HTTP-перенаправлений. * `FileResponse`: для отправки файла из файловой системы. * `StreamingResponse`: для потоковой передачи данных (например, при генерации большого файла). ```python from fastapi.responses import HTMLResponse, RedirectResponse @app.get("/home", response_class=HTMLResponse) def home(): return "

Welcome Home

" @app.get("/docs-redirect") def redirect_to_docs(): return RedirectResponse(url="/docs") ``` 5. **Простые типы** Можно возвращать и простые типы, такие как `str`, `int`, `bytes`. FastAPI автоматически обернет их в соответствующий `Response` (например, `PlainTextResponse` для `str`).

Ответ 18+ 🔞

А, слушай, смотри, вот эта FastAPI штука — она же, блядь, как швейцарский нож, только для ответов от сервера! Можешь возвращать что угодно, а она сама всё красиво упакует, заголовки правильные проставит, в рот меня чих-пых! Главное — не выебывайся сверх меры. Ну, типа, основные варианты, которые в жизни пригодятся: **1. Pydantic-модели — это святое, ёпта!** Вот это прям канон. Напишешь класс, опишешь в нём, что должно вернуться, а FastAPI сама проверит, что ты там не какую-то хуйню отдаёшь, в JSON завернёт и в документацию красивую добавит. Вообще огонь. ```python from pydantic import BaseModel class Item(BaseModel): name: str price: float @app.get("/items/1", response_model=Item) def get_item(): return Item(name="My Item", price=10.5) # И всё, блядь! Больше ничего не надо! ``` **2. Обычный словарик или список** Ну, тут всё просто, как три копейки. Вернул `dict` или `list` — получил JSON. Никакой магии, но работает, сука, идеально. ```python @app.get("/info") def get_info(): return {"version": "1.0", "status": "ok"} # И похуй, что там внутри! ``` **3. Полный контроль через `Response`** А вот если тебе надо, чтобы всё было по твоей, блядь, указке — статус код свой, заголовки свои, да ещё и XML какой-нибудь левый отправить... Тогда бери в руки `Response` и делай что хочешь! ```python from fastapi import Response @app.get("/legacy") def get_legacy_data(): data = "some_xml" return Response(content=data, media_type="application/xml") # На, подавись, современный мир! ``` **4. Готовые ответы на все случаи жизни** Тут тебе и `JSONResponse` для кастомного JSON, и `HTMLResponse` для страничек, и `RedirectResponse` для перенаправлений — вообще, овердохуища вариантов! Хочешь файл отдать — `FileResponse`, хочешь потоком гнать данные — `StreamingResponse`. Красота, а не жизнь! ```python from fastapi.responses import HTMLResponse, RedirectResponse @app.get("/home", response_class=HTMLResponse) def home(): return "

Welcome Home

" # Прям как в старые добрые времена, блядь! @app.get("/docs-redirect") def redirect_to_docs(): return RedirectResponse(url="/docs") # Пошёл нахуй отсюда, вот тебе новый адрес! ``` **5. Да хоть строку или число!** Совсем обленился? Верни просто `str`, `int` или даже `bytes` — FastAPI не обидится, обернёт это в нужный ответ и отправит. Пиздец, как удобно! Короче, суть в чём: не надо изобретать велосипед. Бери то, что подходит под задачу, и не парься. А если начнёшь выёбываться — сам потом и разбирайся, почему всё сломалось. Всё гениальное — просто, как ёбушки-воробушки!