Bird
Raised Fist0
Flaskframework~5 mins

Server-Sent Events alternative in Flask

Choose your learning style10 modes available
Introduction

Server-Sent Events (SSE) let a server send updates to a web page automatically. Sometimes, you need another way to do this, like using WebSockets, which allow two-way communication between the server and the browser.

You want real-time chat where users can send and receive messages instantly.
You need to update a dashboard with live data from the server.
You want to build a game where the server and client talk back and forth quickly.
You want to push notifications to users without them refreshing the page.
Syntax
Flask
from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
socketio = SocketIO(app)

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('message')
def handle_message(msg):
    emit('response', msg, broadcast=True)

if __name__ == '__main__':
    socketio.run(app)

This example uses Flask-SocketIO, a popular Flask extension for WebSockets.

WebSockets allow two-way communication, unlike SSE which is one-way from server to client.

Examples
This listens for a client connecting to the server.
Flask
from flask_socketio import SocketIO

socketio = SocketIO(app)

@socketio.on('connect')
def on_connect():
    print('Client connected')
This sends a chat message to all connected clients.
Flask
@socketio.on('chat message')
def handle_chat(msg):
    emit('chat response', msg, broadcast=True)
Sample Program

This is a simple chat app using Flask and WebSockets. When you type a message and click send, it goes to the server and then broadcasts to all connected clients, updating their message list instantly.

Flask
from flask import Flask, render_template_string
from flask_socketio import SocketIO, emit

app = Flask(__name__)
socketio = SocketIO(app)

html = '''
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>WebSocket Chat</title>
  <script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script>
</head>
<body>
  <h1>Simple WebSocket Chat</h1>
  <input id="msgInput" autocomplete="off" placeholder="Type message..." />
  <button onclick="sendMessage()">Send</button>
  <ul id="messages"></ul>

  <script>
    const socket = io();
    const messages = document.getElementById('messages');

    socket.on('chat response', function(msg) {
      const li = document.createElement('li');
      li.textContent = msg;
      messages.appendChild(li);
    });

    function sendMessage() {
      const input = document.getElementById('msgInput');
      if(input.value.trim() !== '') {
        socket.emit('chat message', input.value);
        input.value = '';
      }
    }
  </script>
</body>
</html>
'''

@app.route('/')
def index():
    return render_template_string(html)

@socketio.on('chat message')
def handle_chat_message(msg):
    emit('chat response', msg, broadcast=True)

if __name__ == '__main__':
    socketio.run(app, debug=True)
OutputSuccess
Important Notes

WebSockets require a client library like Socket.IO to work smoothly with Flask.

Unlike SSE, WebSockets allow the client to send messages to the server too.

Make sure to run the Flask app with SocketIO's run method, not the usual app.run().

Summary

Server-Sent Events send updates one-way from server to browser.

WebSockets are a good alternative for two-way real-time communication.

Flask-SocketIO makes it easy to add WebSockets to your Flask app.

Practice

(1/5)
1. What is a common alternative to Server-Sent Events (SSE) for real-time communication in Flask applications?
easy
A. Static HTML pages
B. Regular HTTP GET requests
C. WebSockets using Flask-SocketIO
D. Email notifications

Solution

  1. Step 1: Understand SSE purpose

    Server-Sent Events send updates one-way from server to browser for real-time data.
  2. Step 2: Identify alternative for two-way communication

    WebSockets allow two-way real-time communication and Flask-SocketIO simplifies their use in Flask.
  3. Final Answer:

    WebSockets using Flask-SocketIO -> Option C
  4. Quick Check:

    Real-time two-way communication = WebSockets [OK]
Hint: WebSockets enable two-way real-time updates, unlike SSE [OK]
Common Mistakes:
  • Confusing SSE with regular HTTP requests
  • Thinking static pages can update in real-time
  • Assuming email is real-time communication
2. Which of the following is the correct way to import Flask-SocketIO in a Flask app?
easy
A. from flask_socketio import SocketIO
B. import flask_socketio.SocketIO
C. from flask import SocketIO
D. import SocketIO from flask_socketio

Solution

  1. Step 1: Recall correct import syntax in Python

    Python uses 'from module import class' to import specific classes.
  2. Step 2: Match Flask-SocketIO import pattern

    The correct import is 'from flask_socketio import SocketIO' to get the SocketIO class.
  3. Final Answer:

    from flask_socketio import SocketIO -> Option A
  4. Quick Check:

    Correct Python import syntax = from flask_socketio import SocketIO [OK]
Hint: Use 'from module import class' for specific imports in Python [OK]
Common Mistakes:
  • Using JavaScript import syntax in Python
  • Importing SocketIO from flask instead of flask_socketio
  • Incorrect module or class names
3. Given this Flask-SocketIO code snippet, what will the client receive when the server emits 'message' event?
from flask_socketio import SocketIO, emit

socketio = SocketIO(app)

@socketio.on('connect')
def handle_connect():
    emit('message', {'data': 'Welcome!'})
medium
A. No message is sent on connect
B. A plain text message 'Welcome!'
C. An error because emit needs a string message
D. A JSON object with {'data': 'Welcome!'}

Solution

  1. Step 1: Understand the emit function usage

    emit sends an event with a dictionary payload as JSON to the client.
  2. Step 2: Analyze the event and data sent on connect

    On 'connect', the server emits 'message' event with {'data': 'Welcome!'} dictionary.
  3. Final Answer:

    A JSON object with {'data': 'Welcome!'} -> Option D
  4. Quick Check:

    emit sends JSON data = A JSON object with {'data': 'Welcome!'} [OK]
Hint: emit sends JSON-like dict, not plain text [OK]
Common Mistakes:
  • Thinking emit sends plain text only
  • Assuming emit requires string, not dict
  • Believing no message is sent on connect
4. Identify the error in this Flask-SocketIO server code:
from flask_socketio import SocketIO

socketio = SocketIO(app)

@socketio.on('message')
def handle_message(data):
    print('Received:', data)

socketio.run(app)
medium
A. Function handle_message missing return statement
B. Missing import of Flask app
C. No event handler for 'connect'
D. Using socketio.run instead of app.run

Solution

  1. Step 1: Check imports and app definition

    The code uses 'app' but does not import or define it anywhere.
  2. Step 2: Confirm socketio.run usage

    socketio.run(app) is correct to run the app with SocketIO support.
  3. Final Answer:

    Missing import of Flask app -> Option B
  4. Quick Check:

    Undefined app variable = Missing import of Flask app [OK]
Hint: Always define or import Flask app before using it [OK]
Common Mistakes:
  • Confusing socketio.run with app.run
  • Thinking event handlers must return values
  • Assuming 'connect' event handler is mandatory
5. You want to replace Server-Sent Events with Flask-SocketIO for a chat app. Which approach correctly handles broadcasting a message to all connected clients?
hard
A. Use socketio.emit('chat', message, broadcast=True) inside an event handler
B. Use emit('chat', message) without broadcast inside the handler
C. Use socketio.send(message) without event name
D. Use app.run() with broadcast=True parameter

Solution

  1. Step 1: Understand broadcasting in Flask-SocketIO

    To send a message to all clients, use socketio.emit with broadcast=True.
  2. Step 2: Evaluate options for broadcasting

    Use socketio.emit('chat', message, broadcast=True) inside an event handler correctly uses socketio.emit with event name and broadcast flag.
  3. Final Answer:

    Use socketio.emit('chat', message, broadcast=True) inside an event handler -> Option A
  4. Quick Check:

    Broadcast all clients = socketio.emit with broadcast=True [OK]
Hint: Broadcast with socketio.emit and broadcast=True [OK]
Common Mistakes:
  • Omitting broadcast=True to send to all clients
  • Using emit without socketio object for broadcast
  • Trying to broadcast via app.run parameters
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard