Bird
Raised Fist0
FastAPIframework~8 mins

WebSocket endpoint creation in FastAPI - Performance & Optimization

Choose your learning style10 modes available
Performance: WebSocket endpoint creation
MEDIUM IMPACT
This affects the responsiveness and resource usage of real-time communication on the page, impacting interaction speed and server load.
Creating a WebSocket endpoint to handle multiple client connections efficiently
FastAPI
from fastapi import FastAPI, WebSocket
from fastapi.websockets import WebSocketDisconnect
app = FastAPI()

class ConnectionManager:
    def __init__(self):
        self.active_connections: list[WebSocket] = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def broadcast(self, message: str):
        for connection in self.active_connections:
            await connection.send_text(message)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await manager.broadcast(f"Client says: {data}")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
Manages connections efficiently, broadcasts messages to all clients, and handles disconnects gracefully, reducing resource leaks and improving responsiveness.
📈 Performance GainReduces memory leaks and CPU spikes, improving INP by handling multiple clients concurrently and cleanly.
Creating a WebSocket endpoint to handle multiple client connections efficiently
FastAPI
from fastapi import FastAPI, WebSocket
app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"Message text was: {data}")
This endpoint handles each connection sequentially without managing connections or limiting resource use, which can cause high memory and CPU usage under many clients.
📉 Performance CostCan cause high CPU usage and memory growth with many clients, increasing server response time and INP delays.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Basic WebSocket endpoint without connection management0 (server-side)00[X] Bad
WebSocket endpoint with connection manager and broadcast0 (server-side)00[OK] Good
Rendering Pipeline
WebSocket endpoints do not directly affect browser rendering but impact interaction responsiveness by maintaining open connections for real-time data exchange.
→Network
→JavaScript Execution
⚠️ BottleneckServer resource management and message handling can bottleneck responsiveness if not optimized.
Core Web Vital Affected
INP
This affects the responsiveness and resource usage of real-time communication on the page, impacting interaction speed and server load.
Optimization Tips
1Always manage WebSocket connections to avoid resource leaks.
2Avoid blocking operations inside WebSocket handlers to keep responsiveness high.
3Reuse WebSocket connections instead of opening new ones for each message.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a key performance benefit of managing WebSocket connections with a connection manager in FastAPI?
AIt automatically compresses WebSocket data to speed up transmission.
BIt reduces the size of the WebSocket messages sent over the network.
CIt prevents memory leaks by tracking and cleaning up disconnected clients.
DIt eliminates the need for asynchronous code in WebSocket handlers.
DevTools: Network
How to check: Open DevTools, go to Network tab, filter by WS (WebSocket), and observe the open WebSocket connection and message frames.
What to look for: Check if the WebSocket connection stays open without errors and messages are sent/received promptly without delays.

Practice

(1/5)
1. What decorator is used in FastAPI to create a WebSocket endpoint?
easy
A. @app.websocket
B. @app.get
C. @app.post
D. @app.route

Solution

  1. Step 1: Understand FastAPI endpoint decorators

    FastAPI uses different decorators for different endpoint types: @app.get for GET HTTP, @app.post for POST HTTP, and @app.websocket for WebSocket connections.
  2. Step 2: Identify the correct decorator for WebSocket

    Since WebSocket is a different protocol from HTTP, FastAPI uses @app.websocket to create WebSocket endpoints.
  3. Final Answer:

    @app.websocket -> Option A
  4. Quick Check:

    WebSocket endpoint decorator = @app.websocket [OK]
Hint: WebSocket endpoints use @app.websocket decorator [OK]
Common Mistakes:
  • Using @app.get or @app.post instead of @app.websocket
  • Confusing HTTP routes with WebSocket routes
  • Trying to use @app.route which is not in FastAPI
2. Which of the following is the correct syntax to accept a WebSocket connection in FastAPI?
easy
A. await websocket.connect()
B. websocket.accept()
C. await websocket.accept()
D. websocket.connect()

Solution

  1. Step 1: Recognize asynchronous WebSocket methods

    FastAPI WebSocket methods are async, so you must use await to call them.
  2. Step 2: Identify the method to accept a connection

    The method to accept a WebSocket connection is accept(), which must be awaited as await websocket.accept().
  3. Final Answer:

    await websocket.accept() -> Option C
  4. Quick Check:

    Accept WebSocket connection = await websocket.accept() [OK]
Hint: Use await with websocket.accept() to accept connection [OK]
Common Mistakes:
  • Forgetting to use await with async methods
  • Using websocket.connect() which does not exist
  • Calling accept() without await causing runtime errors
3. Given this FastAPI WebSocket endpoint code, what will it send back to the client when the client sends 'hello'?
from fastapi import FastAPI, WebSocket
app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    data = await websocket.receive_text()
    await websocket.send_text(f"Message text was: {data}")
medium
A. Message text was: hello
B. hello
C. Message text was: None
D. Error: receive_text() not awaited

Solution

  1. Step 1: Trace the WebSocket message flow

    The server accepts the connection, then waits to receive text from the client. It stores the received text in 'data'.
  2. Step 2: Understand the response sent back

    The server sends back a message with the text 'Message text was: ' plus the received data. If client sends 'hello', the response is 'Message text was: hello'.
  3. Final Answer:

    Message text was: hello -> Option A
  4. Quick Check:

    Sent message = 'Message text was: hello' [OK]
Hint: Server echoes with prefix 'Message text was:' [OK]
Common Mistakes:
  • Confusing received message with sent message
  • Missing await causing runtime errors
  • Assuming server sends back raw client message without prefix
4. Identify the error in this FastAPI WebSocket endpoint code:
from fastapi import FastAPI, WebSocket
app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    websocket.accept()
    data = await websocket.receive_text()
    await websocket.send_text(data)
medium
A. Missing await before websocket.receive_text()
B. Missing await before websocket.accept()
C. Missing await before websocket.send_text()
D. Incorrect WebSocket path

Solution

  1. Step 1: Check async method calls

    In FastAPI, websocket.accept() is an async method and must be awaited.
  2. Step 2: Identify missing await

    The code calls websocket.accept() without await, which will cause a runtime error.
  3. Final Answer:

    Missing await before websocket.accept() -> Option B
  4. Quick Check:

    Async methods require await = missing await [OK]
Hint: Always await async WebSocket methods like accept() [OK]
Common Mistakes:
  • Calling async methods without await
  • Confusing which methods are async
  • Assuming accept() is synchronous
5. You want to create a FastAPI WebSocket endpoint that continuously receives messages and sends back each message reversed. Which code snippet correctly implements this behavior?
hard
A. async def websocket_endpoint(websocket: WebSocket): websocket.accept() while True: data = websocket.receive_text() websocket.send_text(data[::-1])
B. async def websocket_endpoint(websocket: WebSocket): await websocket.accept() data = await websocket.receive_text() await websocket.send_text(data[::-1])
C. async def websocket_endpoint(websocket: WebSocket): await websocket.accept() for data in websocket.receive_text(): await websocket.send_text(data[::-1])
D. async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(data[::-1])

Solution

  1. Step 1: Understand continuous message handling

    To handle multiple messages, the server must loop indefinitely, receiving and sending messages repeatedly.
  2. Step 2: Check async calls and loop structure

    async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(data[::-1]) uses an async while True loop, awaits receive_text(), and sends back reversed text with await send_text(), correctly handling async and continuous flow.
  3. Final Answer:

    async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(data[::-1]) -> Option D
  4. Quick Check:

    Continuous async loop with await calls = async def websocket_endpoint(websocket: WebSocket): await websocket.accept() while True: data = await websocket.receive_text() await websocket.send_text(data[::-1]) [OK]
Hint: Use while True with await receive and send for continuous WebSocket [OK]
Common Mistakes:
  • Missing loop for continuous messages
  • Not awaiting async methods
  • Using for loop incorrectly on async receive_text()
  • Calling async methods without await
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