Maison >développement back-end >Tutoriel Python >Implémentation d'événements envoyés par le serveur (SSE) avec Python et Go

Implémentation d'événements envoyés par le serveur (SSE) avec Python et Go

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 08:35:10281parcourir

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.

Implementing Server-Sent Events (SSE) with Python and Go

Qu'est-ce que l'ESS ?

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.

Pourquoi choisir ESS ?

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.

Aperçu

SSE permet au serveur de transmettre des messages au navigateur en temps réel. Dans le cadre de la spécification HTML5, cela implique :

  • Protocole de communication : Utilise HTTP.
  • Objets d'événement : Disponibles côté navigateur.

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

Implémentation du serveur

Mise en œuvre du protocole

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).

Format des messages

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).

Les champs clés incluent :

  • event : Le type d'événement.
  • id : L'ID d'événement utilisé par le navigateur pour suivre le dernier événement reçu pour la reconnexion.
  • réessayer : Le temps d'attente (en ms) nécessaire au navigateur pour réessayer de se connecter après un échec.
  • données : Les données du message.

Exemple : SSE avec Python

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)

Exemple : SSE avec Go

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)
    }
}

API du navigateur

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>
&Lt;/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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn