ホームページ >バックエンド開発 >Python チュートリアル >Python と Go を使用したサーバー送信イベント (SSE) の実装
今日のインタラクティブな Web アプリケーションでは、ユーザー エクスペリエンスを向上させるためにリアルタイムのデータ更新が重要です。さまざまなリアルタイム通信テクノロジーの中でも、Server-Sent Events (SSE) は、シンプルかつ効果的なソリューションとして際立っています。 SSE を使用すると、サーバーは HTTP 経由でリアルタイムの更新をクライアントにプッシュできます。
Server-Sent Events (SSE) は、サーバーがクライアントにプロアクティブにデータをプッシュできるようにするために使用されるテクノロジーであり、「イベント ストリーム」とも呼ばれます。これは HTTP プロトコルに基づいており、その長期間の接続特性を利用しています。 SSE はクライアントとサーバーの間に永続的な接続を確立し、サーバーがリアルタイムのデータ更新をクライアントに送信できるようにします。ただし、クライアントは SSE を通じてサーバーにデータを送り返すことはできません。
サーバー送信イベントは HTML5 仕様の一部であり、特にサーバーからクライアントにイベントをプッシュするために設計されています。そのシンプルさ、自動再接続、およびイベント追跡機能により、一方向のデータ フローが必要なシナリオに最適です。 SSE は、データが一方向にストリーミングされる場合に非常に優れたパフォーマンスを発揮します。
SSE を使用すると、サーバーはリアルタイムでメッセージをブラウザにプッシュできます。 HTML5 仕様の一部として、以下が含まれます:
WebSocket もリアルタイム通信を提供しますが、大きく異なります。
Feature | SSE | WebSockets |
---|---|---|
Protocol Basis | HTTP | TCP |
Data Flow | Unidirectional (server to client) | Full-duplex (bidirectional) |
Complexity | Lightweight and simple | More complex |
Reconnection | Built-in | Manual implementation needed |
Message Tracking | Automatic | Manual implementation needed |
Data Types | Text or Base64-encoded binary | Various data types supported |
Event Types Support | Custom events supported | Custom events not supported |
Limitations | HTTP/1.1 or HTTP/2 | Unlimited connections |
基本的に、ブラウザは HTTP リクエストを開始し、サーバーは次のヘッダーとともに HTTP ステータスで応答します。
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
SSE では、イベント ストリームの MIME タイプが text/event-stream である必要があると指定されています。ブラウザはデータをキャッシュすべきではなく、接続は永続的 (キープアライブ) のままである必要があります。
イベント ストリームは、gzip で圧縮された UTF-8 エンコードされたテキストまたは Base64 エンコードされたバイナリ メッセージを使用します。各メッセージは、フィールド名 : フィールド値の形式の 1 つ以上のフィールドで構成されます。各フィールドは n で終わります。コロンで始まる行はコメントであり、ブラウザでは無視されます。プッシュ内の複数のメッセージは空行 (nn) で区切られます。
Python を使用した実装は次のとおりです。
from flask import Flask, Response app = Flask(__name__) @app.route('/events') def sse_handler(): def generate(): paragraph = [ "Hello, this is an example of a continuous text output.", "It contains multiple sentences, each of which will be sent to the client as an event.", "This is to simulate the functionality of Server-Sent Events (SSE).", "We can use this method to push real-time updates.", "End of sample text, thank you!", ] for sentence in paragraph: yield f"data: {sentence}\n\n" import time time.sleep(1) return Response(generate(), mimetype='text/event-stream') if __name__ == '__main__': app.run(host='0.0.0.0', port=8081, debug=True)
Go を使用した実装は次のとおりです。
package main import ( "fmt" "log" "net/http" "time" ) func main() { http.HandleFunc("/events", sseHandler) fmt.Println("Starting server on :8080") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatalf("Server error: %v", err) } } func sseHandler(w http.ResponseWriter, r *http.Request) { flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Streaming unsupported!", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") paragraph := []string{ "Hello, this is an example of a continuous text output.", "It contains multiple sentences, each of which will be sent to the client as an event.", "This is to simulate the functionality of Server-Sent Events (SSE).", "We can use this method to push real-time updates.", "End of sample text, thank you!", } for _, sentence := range paragraph { _, err := fmt.Fprintf(w, "data: %s\n\n", sentence) if err != nil { return } flusher.Flush() time.Sleep(1 * time.Second) } }
クライアント側では、JavaScript の EventSource API を使用して、サーバーから送信されたイベントをリッスンする EventSource オブジェクトを作成できます。接続すると、サーバーはブラウザにイベント メッセージを送信できます。ブラウザーは、onmessage、onopen、および onerror イベントをリッスンすることによって、これらのメッセージを処理します。
<!DOCTYPE html> <html lang="ja"> <メタ文字セット="UTF-8"> <meta name="viewport" content="width=device-width、initial-scale=1.0"> <title>SSE の例 ?</title> </head> <h1>サーバー送信イベントの例 ?</h1> <div> <h2> SSE デバッグ ツール </h2> <p>現在、Postman、Insomnia、Bruno、ThunderClient などの多くの人気ツールには、Server-Sent Events (SSE) のデバッグに対する適切なサポートが不足しています。この制限は、開発中に非常にイライラする可能性があります。幸いなことに、EchoAPI は優れた SSE デバッグ機能を提供し、ワークフローの効率と生産性を大幅に向上させます。</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173482771419125.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p> <p>SSE または API のデバッグを使用している場合は、EchoAPI を試してみることを強くお勧めします。デバッグ エクスペリエンスに革命をもたらし、開発プロセスを合理化できます。詳細については、echoapi.com をご覧ください。 </p> <h3> 例: SSE 用 EchoAPI クライアント </h3> <p>EchoAPI では、SSE インターフェイスの使用は簡単です。 URL を入力し、関連するパラメーターを入力して、[<strong>送信</strong>] をクリックするだけで、リクエストの結果が表示されます。</p> <p><img src="https://img.php.cn/upload/article/000/000/000/173482771591634.jpg" alt="Implementing Server-Sent Events (SSE) with Python and Go"></p> </div>
以上がPython と Go を使用したサーバー送信イベント (SSE) の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。