Maison >développement back-end >Tutoriel Python >Implémentation d'événements envoyés par le serveur (SSE) avec Python et Go
Dans les applications Web interactives d'aujourd'hui, les mises à jour des données en temps réel sont cruciales pour améliorer l'expérience utilisateur. Parmi les diverses technologies de communication en temps réel, les événements envoyés par le serveur (SSE) se démarquent comme une solution simple mais efficace. SSE permet aux serveurs de transmettre des mises à jour en temps réel aux clients via HTTP.
Les événements envoyés par le serveur (SSE) sont une technologie utilisée pour permettre au serveur de transmettre des données au client de manière proactive, également connue sous le nom de « flux d'événements ». Il est basé sur le protocole HTTP et profite de ses caractéristiques de connexion longue durée. SSE établit une connexion persistante entre le client et le serveur, permettant au serveur d'envoyer des mises à jour de données en temps réel au client. Cependant, le client ne peut pas renvoyer de données au serveur via SSE.
Les événements envoyés par le serveur font partie de la spécification HTML5, spécialement conçue pour transmettre des événements du serveur au client. Sa simplicité, ses fonctionnalités de reconnexion automatique et de suivi des événements le rendent idéal pour les scénarios nécessitant un flux de données unidirectionnel. SSE fonctionne exceptionnellement bien lorsque les données sont diffusées dans une seule direction.
SSE permet au serveur de transmettre des messages au navigateur en temps réel. Dans le cadre de la spécification HTML5, cela implique :
Bien que les WebSockets offrent également une communication en temps réel, ils diffèrent considérablement :
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 |
Essentiellement, le navigateur initie une requête HTTP et le serveur répond avec un statut HTTP accompagné de ces en-têtes :
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive
SSE spécifie que le type MIME pour les flux d'événements doit être text/event-stream. Les navigateurs ne doivent pas mettre les données en cache et les connexions doivent rester persistantes (keep-alive).
Les flux d'événements utilisent du texte codé en UTF-8 ou des messages binaires codés en Base64 compressés avec gzip. Chaque message se compose d'un ou plusieurs champs, formatés comme nom de champ : valeur de champ. Chaque champ se termine par un n. Les lignes commençant par deux points sont des commentaires ignorés par le navigateur. Plusieurs messages dans un push sont séparés par des lignes vides (nn).
Voici une implémentation utilisant 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)
Voici une implémentation utilisant 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) } }
Côté client, l'API EventSource de JavaScript vous permet de créer un objet EventSource pour écouter les événements envoyés par le serveur. Une fois connecté, le serveur peut envoyer des messages d'événement au navigateur. Le navigateur gère ces messages en écoutant les événements onmessage, onopen et onerror.
<!DOCTYPE html> <html lang="fr"> <tête> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Exemple SSE ?</title> ≪/tête> <corps> <h1>Exemple d'événements envoyés par le serveur ?</h1> <div> <h2> Outils de débogage SSE </h2> <p>Actuellement, de nombreux outils populaires tels que Postman, Insomnia, Bruno et ThunderClient ne disposent pas d'une prise en charge adéquate pour le débogage des événements envoyés par le serveur (SSE). Cette limitation peut être assez frustrante lors du développement. Heureusement, EchoAPI offre d'excellentes capacités de débogage SSE, améliorant considérablement l'efficacité et la productivité du flux de travail.</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>Si vous travaillez avec le débogage SSE ou API, je vous recommande fortement d'essayer EchoAPI. Il peut révolutionner votre expérience de débogage et rationaliser votre processus de développement. Pour plus d’informations, visitez echoapi.com. </p><h3> Exemple : client EchoAPI pour SSE </h3> <p>Dans EchoAPI, l'utilisation de l'interface SSE est simple. Entrez simplement l'URL, remplissez les paramètres pertinents et cliquez sur "<strong>Envoyer</strong>" pour afficher les résultats de votre demande.</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>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!