\n\n\n```\n\n### Форматы SSE сообщений\n\n```python\n# Различные варианты отправки SSE\n\n# 1. Простое сообщение\nyield \"data: Hello World\\n\\n\"\n\n# 2. JSON\nyield f\"data: {json.dumps({'key': 'value'})}\\n\\n\"\n\n# 3. С ID события (для повторного подключения)\nyield \"id: 1\\n\"\nyield \"data: Message\\n\\n\"\n\n# 4. С типом события (для использования addEventListener)\nyield \"event: my_event\\n\"\nyield \"data: {data}\\n\\n\"\n\n# 5. Многострочное сообщение\nyield \"data: Line 1\\n\"\nyield \"data: Line 2\\n\\n\"\n```\n\n### Обработка разных типов событий на клиенте\n\n```javascript\n// Слушать специфический тип события\nconst eventSource = new EventSource('/events');\n\n// Слушать событие типа 'notification'\neventSource.addEventListener('notification', (event) => {\n const data = JSON.parse(event.data);\n showNotification(data.message);\n});\n\n// Слушать событие типа 'update'\neventSource.addEventListener('update', (event) => {\n const data = JSON.parse(event.data);\n updateUI(data);\n});\n\n// Слушать всё события (default type)\neventSource.onmessage = (event) => {\n console.log('Generic message:', event.data);\n};\n```\n\n### Практический пример: уведомления о заказах\n\n```python\n# views.py — Flask\nfrom flask import Flask, Response, session\nimport json\nfrom datetime import datetime\nfrom queue import Queue\nimport threading\n\napp = Flask(__name__)\napp.secret_key = 'secret'\n\n# Очередь для каждого пользователя\nuser_queues = {}\n\n@app.route('/user//events')\ndef user_events(user_id):\n \"\"\"\n Отправлять события конкретному пользователю\n \"\"\"\n # Создать очередь для пользователя\n if user_id not in user_queues:\n user_queues[user_id] = Queue()\n \n queue = user_queues[user_id]\n \n def generate():\n try:\n while True:\n # Получить событие из очереди\n event = queue.get(timeout=30) # Timeout 30 секунд\n yield f\"data: {json.dumps(event)}\\n\\n\"\n except:\n pass\n \n return Response(\n generate(),\n mimetype='text/event-stream',\n headers={\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n }\n )\n\n@app.route('/order//create', methods=['POST'])\ndef create_order(user_id):\n \"\"\"\n Создать заказ и отправить уведомление\n \"\"\"\n order_data = {\n 'event': 'new_order',\n 'order_id': '12345',\n 'status': 'confirmed',\n 'timestamp': datetime.now().isoformat(),\n }\n \n # Отправить событие пользователю\n if user_id in user_queues:\n user_queues[user_id].put(order_data)\n \n return {'ok': True}\n```\n\n### Преимущества SSE\n\n1. **Простота**: использует стандартный HTTP\n2. **Автопереподключение**: встроенное восстановление соединения\n3. **Меньше нагрузки**: сравнение с polling (постоянные запросы)\n4. **ID событий**: может сделать retry с конкретного события\n5. **Поддержка браузеров**: есть во всех современных браузерах\n\n### Недостатки SSE\n\n1. **One-way только**: сервер → клиент\n2. **Лимиты соединений**: браузер может открыть ~6 SSE на домен\n3. **Прокси/firewall**: может быть проблема с длительными соединениями\n4. **Масштабируемость**: сложнее с горизонтальным масштабированием\n\n### Вывод\n\n**Server-Sent Events** — это:\n- Технология отправки данных из сервера на клиент в реальном времени\n- Использует стандартный HTTP/HTTPS протокол\n- **One-way** соединение (сервер → клиент)\n- Идеально для уведомлений, live feed, прогресса\n- Проще чем WebSocket для простых сценариев\n- Встроенное автопереподключение\n- Отличный выбор для реал-тайм приложений","dateCreated":"2026-03-23T08:55:54.038619","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что такое Server-Sent Events?

2.2 Middle🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Server-Sent Events?

Server-Sent Events (SSE) — это технология реального времени, которая позволяет серверу отправлять обновления данных клиенту по одностороннему HTTP соединению. В отличие от WebSocket, SSE использует стандартный HTTP/HTTPS протокол и требует только одного соединения от сервера к клиенту.

Принцип работы SSE

Браузер (клиент)
    ↓
Открывает HTTP соединение
    ↓
Сервер отправляет данные
    ↓
Браузер получает события
    ↑
Соединение остаётся открытым
    ↑
Сервер может отправлять новые события в любой момент

HTTP или WebSocket?

ПараметрSSE (Server-Sent Events)WebSocket
НаправлениеServer → Client (one-way)Bidirectional (both ways)
ProtocolHTTP/HTTPSWebSocket protocol
СложностьПрощеСложнее
НагрузкаНижеВыше
Use caseУведомления, live feedChat, real-time games
АвтопереподключениеВстроеноНужно реализовывать

Реализация на Python (Flask)

# server.py
from flask import Flask, Response
import time
import json
from datetime import datetime

app = Flask(__name__)

# Простой пример: отправка события каждые 2 секунды
@app.route('/events')
def events():
    """
    Endpoint для SSE
    Возвращает данные потоком (stream)
    """
    def generate():
        for i in range(10):  # Отправить 10 событий
            data = {
                'message': f'Событие номер {i}',
                'timestamp': datetime.now().isoformat(),
            }
            # Формат SSE: data: {json_data}\n\n
            yield f"data: {json.dumps(data)}\n\n"
            time.sleep(2)  # Ждать 2 секунды перед следующим событием
    
    return Response(
        generate(),
        mimetype='text/event-stream',
        headers={
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'X-Accel-Buffering': 'no',  # Для Nginx
        }
    )

if __name__ == '__main__':
    app.run(debug=True)

Реализация на Python (Django)

# views.py
import json
from django.http import StreamingHttpResponse
from django.views import View
import time
from datetime import datetime

class EventStreamView(View):
    def get(self, request):
        def event_stream():
            for i in range(5):
                data = {
                    'id': i,
                    'message': f'Сообщение {i}',
                    'time': datetime.now().isoformat(),
                }
                # SSE формат
                yield f"data: {json.dumps(data)}\n\n"
                time.sleep(3)
        
        return StreamingHttpResponse(
            event_stream(),
            content_type='text/event-stream',
            headers={
                'Cache-Control': 'no-cache',
                'X-Accel-Buffering': 'no',
            }
        )

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('events/', views.EventStreamView.as_view(), name='event_stream'),
]

Клиентский код (JavaScript)

// client.js
// Подключиться к SSE потоку
const eventSource = new EventSource('/events');

// Обработать входящие события
eventSource.onmessage = (event) => {
    const data = JSON.parse(event.data);
    console.log('Получено событие:', data);
    
    // Обновить UI
    const messageDiv = document.getElementById('messages');
    messageDiv.innerHTML += `<p>${data.message}</p>`;
};

// Обработать ошибки
eventSource.onerror = (error) => {
    console.error('Ошибка SSE:', error);
    eventSource.close();
};

// Закрыть соединение
function closeConnection() {
    eventSource.close();
}

HTML страница

<!DOCTYPE html>
<html>
<head>
    <title>Server-Sent Events Demo</title>
</head>
<body>
    <h1>Real-time Notifications</h1>
    <div id="messages"></div>
    <button onclick="closeConnection()">Закрыть соединение</button>
    
    <script src="client.js"></script>
</body>
</html>

Форматы SSE сообщений

# Различные варианты отправки SSE

# 1. Простое сообщение
yield "data: Hello World\n\n"

# 2. JSON
yield f"data: {json.dumps({'key': 'value'})}\n\n"

# 3. С ID события (для повторного подключения)
yield "id: 1\n"
yield "data: Message\n\n"

# 4. С типом события (для использования addEventListener)
yield "event: my_event\n"
yield "data: {data}\n\n"

# 5. Многострочное сообщение
yield "data: Line 1\n"
yield "data: Line 2\n\n"

Обработка разных типов событий на клиенте

// Слушать специфический тип события
const eventSource = new EventSource('/events');

// Слушать событие типа 'notification'
eventSource.addEventListener('notification', (event) => {
    const data = JSON.parse(event.data);
    showNotification(data.message);
});

// Слушать событие типа 'update'
eventSource.addEventListener('update', (event) => {
    const data = JSON.parse(event.data);
    updateUI(data);
});

// Слушать всё события (default type)
eventSource.onmessage = (event) => {
    console.log('Generic message:', event.data);
};

Практический пример: уведомления о заказах

# views.py — Flask
from flask import Flask, Response, session
import json
from datetime import datetime
from queue import Queue
import threading

app = Flask(__name__)
app.secret_key = 'secret'

# Очередь для каждого пользователя
user_queues = {}

@app.route('/user/<user_id>/events')
def user_events(user_id):
    """
    Отправлять события конкретному пользователю
    """
    # Создать очередь для пользователя
    if user_id not in user_queues:
        user_queues[user_id] = Queue()
    
    queue = user_queues[user_id]
    
    def generate():
        try:
            while True:
                # Получить событие из очереди
                event = queue.get(timeout=30)  # Timeout 30 секунд
                yield f"data: {json.dumps(event)}\n\n"
        except:
            pass
    
    return Response(
        generate(),
        mimetype='text/event-stream',
        headers={
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'X-Accel-Buffering': 'no',
        }
    )

@app.route('/order/<user_id>/create', methods=['POST'])
def create_order(user_id):
    """
    Создать заказ и отправить уведомление
    """
    order_data = {
        'event': 'new_order',
        'order_id': '12345',
        'status': 'confirmed',
        'timestamp': datetime.now().isoformat(),
    }
    
    # Отправить событие пользователю
    if user_id in user_queues:
        user_queues[user_id].put(order_data)
    
    return {'ok': True}

Преимущества SSE

  1. Простота: использует стандартный HTTP
  2. Автопереподключение: встроенное восстановление соединения
  3. Меньше нагрузки: сравнение с polling (постоянные запросы)
  4. ID событий: может сделать retry с конкретного события
  5. Поддержка браузеров: есть во всех современных браузерах

Недостатки SSE

  1. One-way только: сервер → клиент
  2. Лимиты соединений: браузер может открыть ~6 SSE на домен
  3. Прокси/firewall: может быть проблема с длительными соединениями
  4. Масштабируемость: сложнее с горизонтальным масштабированием

Вывод

Server-Sent Events — это:

  • Технология отправки данных из сервера на клиент в реальном времени
  • Использует стандартный HTTP/HTTPS протокол
  • One-way соединение (сервер → клиент)
  • Идеально для уведомлений, live feed, прогресса
  • Проще чем WebSocket для простых сценариев
  • Встроенное автопереподключение
  • Отличный выбор для реал-тайм приложений
Что такое Server-Sent Events? | PrepBro