web: SSE namesto stanlenga pollinga #14

Closed
opened 2026-03-23 14:56:15 +01:00 by valentin · 2 comments
Owner

implementacija SSE (Server‑Sent Events) v Flasku, ki omogoča:

  • več hkratnih odjemalcev,
  • redne »ping« povezave,
  • pošiljanje dogodkov vsem aktivnim naročnikom,
  • brez persistenčnega shranjevanja.

To je minimalen, a popolnoma funkcionalen “broadcast” model.

implementacija SSE (Server‑Sent Events) v Flasku, ki omogoča: - več hkratnih odjemalcev, - redne »ping« povezave, - pošiljanje dogodkov vsem aktivnim naročnikom, - brez persistenčnega shranjevanja. To je minimalen, a popolnoma funkcionalen “broadcast” model.
Author
Owner

Hitra referenca (od Copilato) za kasnejšo kontrolo:

from flask import Flask, Response, request
from queue import Queue
import threading

app = Flask(__name__)

# Seznam vseh trenutno aktivnih naročnikov
subscribers = []

def event_stream(sub):
    """Generator, ki vrača nove dogodke posameznemu naročniku."""
    try:
        while True:
            msg = sub.get()  # čaka dokler ne pride novo sporočilo
            yield f"data: {msg}\n\n"
    except GeneratorExit:
        # Odjemalec je zaprl povezavo -> odstranimo subscriber
        subscribers.remove(sub)


@app.route('/stream')
def stream():
    """Odjemalec se naroči na SSE stream."""
    def add_subscriber():
        q = Queue()
        subscribers.append(q)
        return q

    q = add_subscriber()
    return Response(event_stream(q), mimetype="text/event-stream")


@app.route('/broadcast', methods=["POST"])
def broadcast():
    """Pošlji sporočilo vsem aktivnim odjemalcem."""
    message = request.json.get("message", "")
    for sub in list(subscribers):
        sub.put(message)
    return {"status": "sent", "subscribers": len(subscribers)}
``

Na strani klienta:

<!DOCTYPE html>
<body>
<script>
    const sse = new EventSource("/stream");

    sse.onmessage = (e) => {
        console.log("Sporočilo:", e.data);
        document.body.innerHTML += `<p>${e.data}</p>`;
    };
</script>
</body>
</html>
Hitra referenca (od Copilato) za kasnejšo kontrolo: ``` from flask import Flask, Response, request from queue import Queue import threading app = Flask(__name__) # Seznam vseh trenutno aktivnih naročnikov subscribers = [] def event_stream(sub): """Generator, ki vrača nove dogodke posameznemu naročniku.""" try: while True: msg = sub.get() # čaka dokler ne pride novo sporočilo yield f"data: {msg}\n\n" except GeneratorExit: # Odjemalec je zaprl povezavo -> odstranimo subscriber subscribers.remove(sub) @app.route('/stream') def stream(): """Odjemalec se naroči na SSE stream.""" def add_subscriber(): q = Queue() subscribers.append(q) return q q = add_subscriber() return Response(event_stream(q), mimetype="text/event-stream") @app.route('/broadcast', methods=["POST"]) def broadcast(): """Pošlji sporočilo vsem aktivnim odjemalcem.""" message = request.json.get("message", "") for sub in list(subscribers): sub.put(message) return {"status": "sent", "subscribers": len(subscribers)} `` ``` Na strani klienta: ``` <!DOCTYPE html> <body> <script> const sse = new EventSource("/stream"); sse.onmessage = (e) => { console.log("Sporočilo:", e.data); document.body.innerHTML += `<p>${e.data}</p>`; }; </script> </body> </html> ```
Author
Owner

Done

Done
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: valentin/Projekcija#14