在 FastAPI 中实现 WebSockets
学习向 FastAPI 应用添加 WebSocket 端点并处理连接。
在 FastAPI 中实现 WebSockets 是 CoddyKit 上的免费 FastAPI Backend Development Bootcamp 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 FastAPI Backend Development Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Real-time with FastAPI WebSockets
Welcome to implementing WebSockets with FastAPI! WebSockets provide a persistent, full-duplex communication channel between a client and a server.
- Full-duplex: Both client and server can send and receive messages simultaneously.
- Real-time: Ideal for applications needing instant updates, like chat, live dashboards, or gaming.
FastAPI has excellent built-in support for WebSockets, leveraging Python's async/await features.
Defining a WebSocket Endpoint
Just like HTTP endpoints, you define WebSocket endpoints using a decorator. Instead of @app.get() or @app.post(), you use @app.websocket().
Your endpoint function must be async def and accept a websocket: WebSocket parameter. This WebSocket object is your primary tool for interaction.
The first step inside your function is always to await websocket.accept() to establish the connection.
Your First WebSocket Connection
Let's create our first WebSocket endpoint. This simple example accepts a connection, sends a welcome message, and then closes the connection.
Notice the @app.websocket("/ws") decorator and the async def function, which are key for WebSocket handling.
Try running this example and observe the connection:
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
await websocket.send_text("Welcome! Connection established.")
await websocket.close()Handling WebSocket Disconnections
WebSocket connections can be interrupted for various reasons (client closes tab, network error). It's crucial to handle these disconnections gracefully.
FastAPI raises a WebSocketDisconnect exception when a client disconnects. You can catch this exception to perform cleanup tasks, like removing the client from a list of active connections.
Wrap your WebSocket communication logic in a try...except WebSocketDisconnect block.
Receiving Messages from Clients
Once connected, your server can receive messages from the client. The WebSocket object provides methods for this:
await websocket.receive_text(): For receiving string data.await websocket.receive_bytes(): For receiving binary data.await websocket.receive_json(): For receiving JSON data (requirespython-multipart).
These operations are asynchronous, so always use await.
Echoing Client Messages Back
This example demonstrates a simple 'echo' server. It accepts a connection, then continuously receives messages from the client and sends them back.
The while True loop keeps the connection open, and the try...except WebSocketDisconnect handles when the client leaves.
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
app = FastAPI()
@app.websocket("/ws/echo")
async def websocket_echo(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_text()
print(f"Received from client: {data}")
await websocket.send_text(f"Server echoed: {data}")
except WebSocketDisconnect:
print("Client disconnected.")Sending Messages to Clients
Similarly, your server can send messages to the client. The WebSocket object offers:
await websocket.send_text("your message"): To send string data.await websocket.send_bytes(b"your bytes"): To send binary data.await websocket.send_json({"key": "value"}): To send JSON data.
Remember to await these calls. It's common to send a response right after receiving a message.
Working with JSON Data
For structured data, sending and receiving JSON is preferred. FastAPI's WebSocket object handles serialization/deserialization for you.
- Sending: Pass a Python
dicttosend_json(). - Receiving:
receive_json()returns a Pythondict.
This simplifies data exchange compared to manually parsing strings.
Simple Connection Manager
For applications with multiple clients, you'll need to manage active connections. A common pattern is to use a class to keep track of all connected WebSocket objects.
This manager can then be used to add/remove connections and send messages to specific clients or broadcast to all.
from fastapi import WebSocket
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 send_personal_message(self, message: str, websocket: WebSocket):
await websocket.send_text(message)
# In a real app, you'd integrate 'manager' into your FastAPI endpoint
manager = ConnectionManager()WebSocket Interaction Check
You've learned the basics of setting up and interacting with WebSocket connections in FastAPI.
Let's check your understanding of accepting new connections.
Recap: Implementing WebSockets
You've successfully learned how to implement WebSockets in FastAPI!
- Use
@app.websocket()to define endpoints. - Always
await websocket.accept()to establish the connection. - Handle disconnections with
try...except WebSocketDisconnect. - Use
await websocket.receive_text()andawait websocket.send_text()for communication. - For structured data,
send_json()andreceive_json()are your friends.
Next, you'll build a real-time chat application to put these concepts into practice!
常见问题解答
「在 FastAPI 中实现 WebSockets」课时是免费的吗?
是的 — 「在 FastAPI 中实现 WebSockets」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 FastAPI Backend Development Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 FastAPI Backend Development Bootcamp 课程共包含 4 节课。
「在 FastAPI 中实现 WebSockets」这节课中我会学到什么?
学习向 FastAPI 应用添加 WebSocket 端点并处理连接。 你通过在浏览器中直接运行的动手代码来练习 FastAPI Backend Development Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 FastAPI Backend Development Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 FastAPI Backend Development Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「在 FastAPI 中实现 WebSockets」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 FastAPI Backend Development Bootcamp 课中编写并运行代码吗?
能。每节 FastAPI Backend Development Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- WebSocket 协议基础
- 在 FastAPI 中实现 WebSockets
- 构建实时聊天应用
- 使用发布/订阅后端扩展 WebSockets