From e007fb9dbe6085e4f4c47bb8072b7e306d915864 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 18 Mar 2026 15:51:09 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=90=20Update=20translations=20for=20ru?= =?UTF-8?q?=20(update-and-add)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ru/docs/alternatives.md | 56 ++++----- docs/ru/docs/async.md | 30 ++--- docs/ru/docs/editor-support.md | 23 ++++ docs/ru/docs/tutorial/server-sent-events.md | 120 ++++++++++++++++++++ 4 files changed, 186 insertions(+), 43 deletions(-) create mode 100644 docs/ru/docs/editor-support.md create mode 100644 docs/ru/docs/tutorial/server-sent-events.md diff --git a/docs/ru/docs/alternatives.md b/docs/ru/docs/alternatives.md index 1f713c3f39..13bac7f92b 100644 --- a/docs/ru/docs/alternatives.md +++ b/docs/ru/docs/alternatives.md @@ -14,7 +14,7 @@ ## Предшествующие инструменты { #previous-tools } -### Django { #django } +### [Django](https://www.djangoproject.com/) { #django } Это самый популярный Python-фреймворк, ему широко доверяют. Он используется для построения систем вроде Instagram. @@ -22,7 +22,7 @@ Он был создан для генерации HTML на бэкенде, а не для создания API, используемых современным фронтендом (например, React, Vue.js и Angular) или другими системами (например, устройствами IoT), которые с ним общаются. -### Django REST Framework { #django-rest-framework } +### [Django REST Framework](https://www.django-rest-framework.org/) { #django-rest-framework } Django REST Framework был создан как гибкий набор инструментов для построения веб-API поверх Django, чтобы улучшить его возможности в части API. @@ -42,7 +42,7 @@ Django REST Framework был создан Томом Кристи. Он же с /// -### Flask { #flask } +### [Flask](https://flask.palletsprojects.com) { #flask } Flask — это «микрофреймворк», он не включает интеграции с базами данных и многие другие вещи, которые в Django идут «из коробки». @@ -64,7 +64,7 @@ Flask — это «микрофреймворк», он не включает и /// -### Requests { #requests } +### [Requests](https://requests.readthedocs.io) { #requests } **FastAPI** на самом деле не альтернатива **Requests**. Их области применения очень различны. @@ -106,7 +106,7 @@ def read_url(): /// -### Swagger / OpenAPI { #swagger-openapi } +### [Swagger](https://swagger.io/) / [OpenAPI](https://github.com/OAI/OpenAPI-Specification/) { #swagger-openapi } Главной возможностью, которую хотелось взять из Django REST Framework, была автоматическая документация API. @@ -124,8 +124,8 @@ def read_url(): И интегрировать основанные на стандартах инструменты пользовательского интерфейса: -* Swagger UI -* ReDoc +* [Swagger UI](https://github.com/swagger-api/swagger-ui) +* [ReDoc](https://github.com/Rebilly/ReDoc) Эти два инструмента выбраны за популярность и стабильность, но даже при беглом поиске можно найти десятки альтернативных интерфейсов для OpenAPI (которые можно использовать с **FastAPI**). @@ -135,7 +135,7 @@ def read_url(): Существует несколько REST-фреймворков для Flask, но, вложив время и усилия в исследование, я обнаружил, что многие из них прекращены или заброшены, с несколькими нерешёнными Issue (тикет\обращение), из-за которых они непригодны. -### Marshmallow { #marshmallow } +### [Marshmallow](https://marshmallow.readthedocs.io/en/stable/) { #marshmallow } Одна из основных возможностей, нужных системам API, — «сериализация» данных, то есть преобразование данных из кода (Python) во что-то, что можно отправить по сети. Например, преобразование объекта с данными из базы в JSON-объект. Преобразование объектов `datetime` в строки и т. п. @@ -153,7 +153,7 @@ def read_url(): /// -### Webargs { #webargs } +### [Webargs](https://webargs.readthedocs.io/en/latest/) { #webargs } Ещё одна важная возможность для API — парсинг данных из входящих HTTP-запросов. @@ -175,7 +175,7 @@ Webargs был создан теми же разработчиками, что /// -### APISpec { #apispec } +### [APISpec](https://apispec.readthedocs.io/en/stable/) { #apispec } Marshmallow и Webargs предоставляют валидацию, парсинг и сериализацию как плагины. @@ -205,7 +205,7 @@ APISpec был создан теми же разработчиками, что /// -### Flask-apispec { #flask-apispec } +### [Flask-apispec](https://flask-apispec.readthedocs.io/en/latest/) { #flask-apispec } Это плагин для Flask, который связывает Webargs, Marshmallow и APISpec. @@ -219,11 +219,11 @@ APISpec был создан теми же разработчиками, что Его использование привело к созданию нескольких full-stack генераторов на Flask. Это основные стеки, которые я (и несколько внешних команд) использовали до сих пор: -* https://github.com/tiangolo/full-stack -* https://github.com/tiangolo/full-stack-flask-couchbase -* https://github.com/tiangolo/full-stack-flask-couchdb +* [https://github.com/tiangolo/full-stack](https://github.com/tiangolo/full-stack) +* [https://github.com/tiangolo/full-stack-flask-couchbase](https://github.com/tiangolo/full-stack-flask-couchbase) +* [https://github.com/tiangolo/full-stack-flask-couchdb](https://github.com/tiangolo/full-stack-flask-couchdb) -И эти же full-stack генераторы стали основой для [Генераторов проектов **FastAPI**](project-generation.md){.internal-link target=_blank}. +И эти же full-stack генераторы стали основой для [Генераторов проектов **FastAPI**](project-generation.md). /// info | Информация @@ -237,7 +237,7 @@ Flask-apispec был создан теми же разработчиками, ч /// -### NestJSAngular) { #nestjs-and-angular } +### [NestJS](https://nestjs.com/) (и [Angular](https://angular.io/)) { #nestjs-and-angular } Это даже не Python. NestJS — это JavaScript/TypeScript-фреймворк на NodeJS, вдохновлённый Angular. @@ -259,13 +259,13 @@ Flask-apispec был создан теми же разработчиками, ч /// -### Sanic { #sanic } +### [Sanic](https://sanic.readthedocs.io/en/latest/) { #sanic } Это был один из первых чрезвычайно быстрых Python-фреймворков на основе `asyncio`. Он был сделан очень похожим на Flask. /// note | Технические детали -Он использовал `uvloop` вместо стандартного цикла `asyncio` в Python. Это и сделало его таким быстрым. +Он использовал [`uvloop`](https://github.com/MagicStack/uvloop) вместо стандартного цикла `asyncio` в Python. Это и сделало его таким быстрым. Он явно вдохновил Uvicorn и Starlette, которые сейчас быстрее Sanic в открытых бенчмарках. @@ -279,7 +279,7 @@ Flask-apispec был создан теми же разработчиками, ч /// -### Falcon { #falcon } +### [Falcon](https://falconframework.org/) { #falcon } Falcon — ещё один высокопроизводительный Python-фреймворк, он минималистичен и служит основой для других фреймворков, таких как Hug. @@ -297,7 +297,7 @@ Falcon — ещё один высокопроизводительный Python- /// -### Molten { #molten } +### [Molten](https://moltenframework.com/) { #molten } Я обнаружил Molten на ранних этапах создания **FastAPI**. И у него были очень похожие идеи: @@ -321,7 +321,7 @@ Falcon — ещё один высокопроизводительный Python- /// -### Hug { #hug } +### [Hug](https://github.com/hugapi/hug) { #hug } Hug был одним из первых фреймворков, реализовавших объявление типов параметров API с использованием аннотаций типов Python. Это была отличная идея, которая вдохновила и другие инструменты. @@ -337,7 +337,7 @@ Hug был одним из первых фреймворков, реализов /// info | Информация -Hug был создан Тимоти Кросли, тем же автором `isort`, отличного инструмента для автоматической сортировки импортов в файлах Python. +Hug был создан Тимоти Кросли, тем же автором [`isort`](https://github.com/timothycrosley/isort), отличного инструмента для автоматической сортировки импортов в файлах Python. /// @@ -351,7 +351,7 @@ Hug вдохновил **FastAPI** объявлять параметр `response /// -### APIStar (<= 0.5) { #apistar-0-5 } +### [APIStar](https://github.com/encode/apistar) (<= 0.5) { #apistar-0-5 } Прямо перед решением строить **FastAPI** я нашёл сервер **APIStar**. В нём было почти всё, что я искал, и отличный дизайн. @@ -401,7 +401,7 @@ APIStar был создан Томом Кристи. Тем самым чело ## Что используется в **FastAPI** { #used-by-fastapi } -### Pydantic { #pydantic } +### [Pydantic](https://docs.pydantic.dev/) { #pydantic } Pydantic — это библиотека для определения валидации данных, сериализации и документации (с использованием JSON Schema) на основе аннотаций типов Python. @@ -417,7 +417,7 @@ Pydantic — это библиотека для определения вали /// -### Starlette { #starlette } +### [Starlette](https://www.starlette.dev/) { #starlette } Starlette — это лёгкий ASGI фреймворк/набор инструментов, идеально подходящий для создания высокопроизводительных asyncio‑сервисов. @@ -462,7 +462,7 @@ ASGI — это новый «стандарт», разрабатываемый /// -### Uvicorn { #uvicorn } +### [Uvicorn](https://www.uvicorn.dev/) { #uvicorn } Uvicorn — молниеносный ASGI-сервер, построенный на uvloop и httptools. @@ -476,10 +476,10 @@ Uvicorn — молниеносный ASGI-сервер, построенный Также вы можете использовать опцию командной строки `--workers`, чтобы получить асинхронный многопроцессный сервер. -Подробнее см. раздел [Развёртывание](deployment/index.md){.internal-link target=_blank}. +Подробнее см. раздел [Развёртывание](deployment/index.md). /// ## Бенчмарки и скорость { #benchmarks-and-speed } -Чтобы понять, сравнить и увидеть разницу между Uvicorn, Starlette и FastAPI, см. раздел о [Бенчмарках](benchmarks.md){.internal-link target=_blank}. +Чтобы понять, сравнить и увидеть разницу между Uvicorn, Starlette и FastAPI, см. раздел о [Бенчмарках](benchmarks.md). diff --git a/docs/ru/docs/async.md b/docs/ru/docs/async.md index bff32aaf49..7fd702184c 100644 --- a/docs/ru/docs/async.md +++ b/docs/ru/docs/async.md @@ -12,7 +12,7 @@ results = await some_library() ``` -Тогда объявляйте *функции-обработчики пути* с `async def`, например: +Тогда объявляйте *функции-обработчиков пути* с `async def`, например: ```Python hl_lines="2" @app.get('/') @@ -29,7 +29,7 @@ async def read_results(): --- -Если вы используете стороннюю библиотеку, которая взаимодействует с чем-то (база данных, API, файловая система и т.д.) и не поддерживает использование `await` (сейчас это относится к большинству библиотек для БД), тогда объявляйте *функции-обработчики пути* как обычно, просто с `def`, например: +Если вы используете стороннюю библиотеку, которая взаимодействует с чем-то (база данных, API, файловая система и т.д.) и не поддерживает использование `await` (сейчас это относится к большинству библиотек для БД), тогда объявляйте *функции-обработчиков пути* как обычно, просто с `def`, например: ```Python hl_lines="2" @app.get('/') @@ -48,7 +48,7 @@ def results(): --- -**Примечание**: вы можете смешивать `def` и `async def` в *функциях-обработчиках пути* столько, сколько нужно, и объявлять каждую так, как лучше для вашего случая. FastAPI сделает с ними всё как надо. +**Примечание**: вы можете смешивать `def` и `async def` в *функциях-обработчиков пути* столько, сколько нужно, и объявлять каждую так, как лучше для вашего случая. FastAPI сделает с ними всё как надо. В любом из случаев выше FastAPI всё равно работает асинхронно и очень быстро. @@ -141,7 +141,7 @@ def results(): /// info | Информация -Прекрасные иллюстрации от Ketrina Thompson. 🎨 +Прекрасные иллюстрации от [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -207,7 +207,7 @@ def results(): /// info | Информация -Прекрасные иллюстрации от Ketrina Thompson. 🎨 +Прекрасные иллюстрации от [Ketrina Thompson](https://www.instagram.com/ketrinadrawsalot). 🎨 /// @@ -251,7 +251,7 @@ def results(): Того же уровня производительности вы получаете с **FastAPI**. -А так как можно одновременно использовать параллелизм и асинхронность, вы получаете производительность выше, чем у большинства протестированных фреймворков на NodeJS и на уровне Go, который — компилируемый язык, ближе к C (всё благодаря Starlette). +А так как можно одновременно использовать параллелизм и асинхронность, вы получаете производительность выше, чем у большинства протестированных фреймворков на NodeJS и на уровне Go, который — компилируемый язык, ближе к C [(всё благодаря Starlette)](https://www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=query&l=zijmkf-1). ### Конкурентность лучше параллелизма? { #is-concurrency-better-than-parallelism } @@ -298,7 +298,7 @@ def results(): Плюс к этому простой факт, что Python — основной язык для **Data Science**, Машинного обучения и особенно Глубокого обучения, делает FastAPI очень хорошим выбором для веб-API и приложений в области Data Science / Машинного обучения (среди многих других). -Как добиться такого параллелизма в продакшн, см. раздел [Развёртывание](deployment/index.md){.internal-link target=_blank}. +Как добиться такого параллелизма в продакшн, см. раздел [Развёртывание](deployment/index.md). ## `async` и `await` { #async-and-await } @@ -363,13 +363,13 @@ async def read_burgers(): ### Пишите свой асинхронный код { #write-your-own-async-code } -Starlette (и **FastAPI**) основаны на AnyIO, что делает их совместимыми и со стандартной библиотекой Python asyncio, и с Trio. +Starlette (и **FastAPI**) основаны на [AnyIO](https://anyio.readthedocs.io/en/stable/), что делает их совместимыми и со стандартной библиотекой Python [asyncio](https://docs.python.org/3/library/asyncio-task.html), и с [Trio](https://trio.readthedocs.io/en/stable/). -В частности, вы можете напрямую использовать AnyIO для продвинутых сценариев конкурентности, где в вашем коде нужны более сложные паттерны. +В частности, вы можете напрямую использовать [AnyIO](https://anyio.readthedocs.io/en/stable/) для продвинутых сценариев конкурентности, где в вашем коде нужны более сложные паттерны. -И даже если вы не используете FastAPI, вы можете писать свои асинхронные приложения с AnyIO, чтобы они были максимально совместимыми и получали его преимущества (например, *структурную конкурентность*). +И даже если вы не используете FastAPI, вы можете писать свои асинхронные приложения с [AnyIO](https://anyio.readthedocs.io/en/stable/), чтобы они были максимально совместимыми и получали его преимущества (например, *структурную конкурентность*). -Я создал ещё одну библиотеку поверх AnyIO, тонкий слой, чтобы немного улучшить аннотации типов и получить более качественное **автозавершение**, **ошибки прямо в редакторе** и т.д. Там также есть дружелюбное введение и руководство, чтобы помочь вам **понять** и писать **свой собственный асинхронный код**: Asyncer. Она особенно полезна, если вам нужно **комбинировать асинхронный код с обычным** (блокирующим/синхронным) кодом. +Я создал ещё одну библиотеку поверх AnyIO, тонкий слой, чтобы немного улучшить аннотации типов и получить более качественное **автозавершение**, **ошибки прямо в редакторе** и т.д. Там также есть дружелюбное введение и руководство, чтобы помочь вам **понять** и писать **свой собственный асинхронный код**: [Asyncer](https://asyncer.tiangolo.com/). Она особенно полезна, если вам нужно **комбинировать асинхронный код с обычным** (блокирующим/синхронным) кодом. ### Другие формы асинхронного кода { #other-forms-of-asynchronous-code } @@ -381,7 +381,7 @@ Starlette (и **FastAPI**) основаны на Gevent. Но такой код гораздо сложнее понимать, отлаживать и держать в голове. +В предыдущих версиях Python можно было использовать потоки или [Gevent](https://www.gevent.org/). Но такой код гораздо сложнее понимать, отлаживать и держать в голове. В прежних версиях NodeJS/браузерного JavaScript вы бы использовали «callbacks» (обратные вызовы), что приводит к «callback hell» (ад обратных вызовов). @@ -419,15 +419,15 @@ Starlette (и **FastAPI**) основаны на I/O. -Тем не менее, в обоих случаях велика вероятность, что **FastAPI** [всё равно будет быстрее](index.md#performance){.internal-link target=_blank} (или как минимум сопоставим) с вашим предыдущим фреймворком. +Тем не менее, в обоих случаях велика вероятность, что **FastAPI** [всё равно будет быстрее](index.md#performance) (или как минимум сопоставим) с вашим предыдущим фреймворком. ### Зависимости { #dependencies } -То же относится к [зависимостям](tutorial/dependencies/index.md){.internal-link target=_blank}. Если зависимость — это обычная функция `def`, а не `async def`, она запускается во внешнем пуле потоков. +То же относится к [зависимостям](tutorial/dependencies/index.md). Если зависимость — это обычная функция `def`, а не `async def`, она запускается во внешнем пуле потоков. ### Подзависимости { #sub-dependencies } -У вас может быть несколько зависимостей и [подзависимостей](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank}, которые требуют друг друга (в виде параметров определений функций): часть из них может быть объявлена с `async def`, а часть — обычным `def`. Всё будет работать, а те, что объявлены обычным `def`, будут вызываться во внешнем потоке (из пула), а не «ожидаться». +У вас может быть несколько зависимостей и [подзависимостей](tutorial/dependencies/sub-dependencies.md), которые требуют друг друга (в виде параметров определений функций): часть из них может быть объявлена с `async def`, а часть — обычным `def`. Всё будет работать, а те, что объявлены обычным `def`, будут вызываться во внешнем потоке (из пула), а не «ожидаться». ### Другие служебные функции { #other-utility-functions } diff --git a/docs/ru/docs/editor-support.md b/docs/ru/docs/editor-support.md new file mode 100644 index 0000000000..0543e7162d --- /dev/null +++ b/docs/ru/docs/editor-support.md @@ -0,0 +1,23 @@ +# Поддержка редактора кода { #editor-support } + +Официальное [расширение FastAPI](https://marketplace.visualstudio.com/items?itemName=FastAPILabs.fastapi-vscode) улучшает ваш процесс разработки на FastAPI за счет обнаружения и навигации по *операциям пути* (обработчикам пути), а также развертывания в FastAPI Cloud и потоковой передачи логов в реальном времени. + +Подробности о расширении смотрите в README в [репозитории GitHub](https://github.com/fastapi/fastapi-vscode). + +## Установка и настройка { #setup-and-installation } + +**Расширение FastAPI** доступно как для [VS Code](https://code.visualstudio.com/), так и для [Cursor](https://www.cursor.com/). Его можно установить напрямую из панели расширений в каждом редакторе кода, выполнив поиск по «FastAPI» и выбрав расширение от **FastAPI Labs**. Расширение также работает в браузерных редакторах кода, таких как [vscode.dev](https://vscode.dev) и [github.dev](https://github.dev). + +### Обнаружение приложения { #application-discovery } + +По умолчанию расширение автоматически обнаруживает приложения FastAPI в вашем рабочем пространстве, сканируя файлы, где создается экземпляр `FastAPI()`. Если авто-обнаружение не подходит для структуры вашего проекта, вы можете указать точку входа через `[tool.fastapi]` в `pyproject.toml` или настройку VS Code `fastapi.entryPoint`, используя модульную нотацию (например, `myapp.main:app`). + +## Возможности { #features } + +- **Обозреватель операций пути** — древовидное представление на боковой панели всех *операций пути* вашего приложения. Нажмите, чтобы перейти к любому маршруту или определению роутера. +- **Поиск маршрутов** — поиск по пути, методу или имени с помощью Ctrl + Shift + E (на macOS: Cmd + Shift + E). +- **Навигация CodeLens** — кликабельные ссылки над вызовами тестового клиента (например, `client.get('/items')`), которые переходят к соответствующей *операции пути* для быстрой навигации между тестами и реализацией. +- **Развернуть в FastAPI Cloud** — развертывание вашего приложения в один клик в [FastAPI Cloud](https://fastapicloud.com/). +- **Поток логов приложения** — потоковая передача логов в реальном времени из вашего приложения, развернутого в FastAPI Cloud, с фильтрацией по уровню и текстовым поиском. + +Если вы хотите поверхностно ознакомиться с возможностями расширения, откройте палитру команд (Ctrl + Shift + P или на macOS: Cmd + Shift + P), выберите «Welcome: Open walkthrough...», а затем «Get started with FastAPI». diff --git a/docs/ru/docs/tutorial/server-sent-events.md b/docs/ru/docs/tutorial/server-sent-events.md new file mode 100644 index 0000000000..be6bd23665 --- /dev/null +++ b/docs/ru/docs/tutorial/server-sent-events.md @@ -0,0 +1,120 @@ +# События, отправляемые сервером (SSE) { #server-sent-events-sse } + +Вы можете передавать данные потоком клиенту, используя Server-Sent Events (SSE). + +Это похоже на [Стриминг JSON Lines](stream-json-lines.md), но использует формат `text/event-stream`, который нативно поддерживается браузерами через [`EventSource` API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). + +/// info | Информация + +Добавлено в FastAPI 0.135.0. + +/// + +## Что такое Server-Sent Events? { #what-are-server-sent-events } + +SSE — это стандарт для потоковой передачи данных с сервера на клиента по HTTP. + +Каждое событие — это небольшой текстовый блок с «полями», такими как `data`, `event`, `id` и `retry`, разделёнными пустыми строками. + +Это выглядит так: + +``` +data: {"name": "Portal Gun", "price": 999.99} + +data: {"name": "Plumbus", "price": 32.99} + +``` + +SSE часто используют для стриминга ответов ИИ в чатах, живых уведомлений, логов и наблюдаемости, а также в других случаях, когда сервер «проталкивает» обновления клиенту. + +/// tip | Совет + +Если вам нужно стримить бинарные данные, например видео или аудио, посмотрите расширенное руководство: [Stream Data](../advanced/stream-data.md). + +/// + +## Стриминг SSE с FastAPI { #stream-sse-with-fastapi } + +Чтобы стримить SSE с FastAPI, используйте `yield` в своей функции-обработчике пути и укажите `response_class=EventSourceResponse`. + +Импортируйте `EventSourceResponse` из `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[4,22] *} + +Каждый возвращаемый через `yield` элемент кодируется как JSON и отправляется в поле `data:` события SSE. + +Если вы объявите тип возврата как `AsyncIterable[Item]`, FastAPI будет использовать его, чтобы выполнить **валидацию**, добавить **документацию** и **сериализовать** данные с помощью Pydantic. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[1:25] hl[10:12,23] *} + +/// tip | Совет + +Так как Pydantic будет сериализовать это на стороне **Rust**, вы получите значительно более высокую **производительность**, чем если не объявите тип возврата. + +/// + +### Несинхронные функции-обработчики пути { #non-async-path-operation-functions } + +Вы также можете использовать обычные функции `def` (без `async`) и применять `yield` тем же образом. + +FastAPI проследит, чтобы выполнение прошло корректно и не блокировало цикл событий. + +Так как в этом случае функция не async, правильным типом возврата будет `Iterable[Item]`: + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[28:31] hl[29] *} + +### Без объявленного типа возврата { #no-return-type } + +Вы также можете опустить тип возврата. FastAPI использует [`jsonable_encoder`](./encoder.md) для преобразования данных и их отправки. + +{* ../../docs_src/server_sent_events/tutorial001_py310.py ln[34:37] hl[35] *} + +## `ServerSentEvent` { #serversentevent } + +Если вам нужно задать поля SSE, такие как `event`, `id`, `retry` или `comment`, вы можете возвращать через `yield` объекты `ServerSentEvent` вместо обычных данных. + +Импортируйте `ServerSentEvent` из `fastapi.sse`: + +{* ../../docs_src/server_sent_events/tutorial002_py310.py hl[4,26] *} + +Поле `data` всегда кодируется как JSON. Вы можете передавать любое значение, сериализуемое в JSON, включая Pydantic-модели. + +## Необработанные данные { #raw-data } + +Если нужно отправлять данные без JSON-кодирования, используйте `raw_data` вместо `data`. + +Это полезно для отправки заранее отформатированного текста, строк логов или специальных значений «сентинель», например `[DONE]`. + +{* ../../docs_src/server_sent_events/tutorial003_py310.py hl[17] *} + +/// note | Примечание + +`data` и `raw_data` взаимно исключают друг друга. В каждом `ServerSentEvent` можно задать только одно из них. + +/// + +## Возобновление с `Last-Event-ID` { #resuming-with-last-event-id } + +Когда браузер переподключается после обрыва соединения, он отправляет последний полученный `id` в HTTP-заголовке `Last-Event-ID`. + +Вы можете прочитать его как параметр заголовка и использовать, чтобы возобновить поток с того места, где клиент остановился: + +{* ../../docs_src/server_sent_events/tutorial004_py310.py hl[25,27,31] *} + +## SSE с POST { #sse-with-post } + +SSE работает с любым HTTP-методом, не только с `GET`. + +Это полезно для таких протоколов, как [MCP](https://modelcontextprotocol.io), которые стримят SSE по `POST`: + +{* ../../docs_src/server_sent_events/tutorial005_py310.py hl[14] *} + +## Технические детали { #technical-details } + +FastAPI из коробки реализует некоторые лучшие практики для SSE. + +- Отправлять комментарий «ping» для поддержания соединения («keep alive») каждые 15 секунд, когда нет сообщений, чтобы предотвратить закрытие соединения некоторыми прокси, как рекомендовано в [HTML specification: Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#authoring-notes). +- Устанавливать заголовок `Cache-Control: no-cache`, чтобы предотвратить кэширование потока. +- Устанавливать специальный заголовок `X-Accel-Buffering: no`, чтобы предотвратить буферизацию в некоторых прокси, например Nginx. + +Вам не нужно ничего настраивать, это работает из коробки. 🤓