FastAPI WebSocket:揭秘流畅的双向沟通秘诀

文章标题:

FastAPI中WebSocket的运用:探索高效双向交互之道

文章内容:

示例代码运行环境

Python 3.8+

安装依赖:pip install fastapi==0.68.0 uvicorn==0.15.0 websockets==10.3 pydantic==1.10.7

一、WebSocket路由声明规范

1.1 基础路由定义

通过@app.websocket装饰器来定义WebSocket路由:

from fastapi import FastAPI, WebSocket

app = FastAPI()


@app.websocket("/ws/chat/{room_id}")
async def websocket_chat(websocket: WebSocket, room_id: int):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"Room {room_id}: {data}")
    except WebSocketDisconnect:
        print("Client disconnected")

关键要点解读:
* 路径参数通过URL直接传递(如{room_id})
* WebSocket对象会自动注入到路由函数中
* 必须显式调用await websocket.accept()来建立连接
* 通过receive_text()send_text()实现双向的数据通信

1.2 路由参数验证

结合路径参数与查询参数进行复合验证:

from fastapi import Query, WebSocket


@app.websocket("/ws/secure/{client_id}")
async def secure_ws(
        websocket: WebSocket,
        client_id: int = Path(..., gt=0),
        token: str = Query(..., min_length=8)
):
    if not validate_token(token):
        await websocket.close(code=1008)
        return
    # ...连接处理逻辑...


## 二、客户端连接建立与握手验证

### 2.1 握手过程控制
自定义握手验证流程:

```python
@app.websocket("/ws/auth")
async def auth_ws(websocket: WebSocket):
    # 手动控制握手过程
    await websocket.accept()

    # 获取握手时的请求头
    headers = websocket.headers
    auth_token = headers.get("authorization")

    if not verify_jwt_token(auth_token):
        await websocket.close(code=1008, reason="Invalid credentials")
        return

    # 验证通过后的处理逻辑

2.2 验证失败处理模式

graph TD
A[客户端请求连接] --> B{验证Headers}
B -- 成功 --> C[返回101状态码]
B -- 失败 --> D[返回403状态码]
C --> E[建立双向通信]
D --> F[关闭TCP连接]

三、连接状态维护与生命周期管理

3.1 连接状态跟踪

使用字典来维护活跃的连接:

from typing import Dict

active_connections: Dict[str, WebSocket] = {}


@app.websocket("/ws/status")
async def status_ws(websocket: WebSocket):
    await websocket.accept()
    client_id = str(websocket.client)
    active_connections[client_id] = websocket

    try:
        while True:
            # 保持连接活跃
            await websocket.receive_text()
    except WebSocketDisconnect:
        del active_connections[client_id]

3.2 心跳检测机制

import asyncio


async def heartbeat(websocket: WebSocket, interval: int = 30):
    try:
        while True:
            await asyncio.sleep(interval)
            await websocket.send_json({
                "type": "heartbeat",
                "timestamp": time.time()
            })
    except WebSocketDisconnect:
        print("Heartbeat terminated")


@app.websocket("/ws/realtime")
async def realtime_ws(websocket: WebSocket):
    await websocket.accept()
    # 启动独立心跳任务
    heartbeat_task = asyncio.create_task(heartbeat(websocket))

    try:
        # 主消息处理循环
        while True:
            data = await websocket.receive_json()
            # 处理业务逻辑...
    finally:
        heartbeat_task.cancel()
        await websocket.close()


## 课后 Quiz

  1. 当客户端发送非文本格式数据时如何处理?

```python
# 正确处理方法
try:
    data = await websocket.receive_json()
except WebSocketDisconnect:
    # 处理断开逻辑
except ValueError:
    await websocket.send_text("ERROR: 仅支持JSON格式")

# 错误处理方法:直接使用未校验的receive()
  1. 如何获取客户端的真实IP地址?
# 正确方法
client_ip = websocket.client.host

# 常见错误:直接读取X-Forwarded-For头
# 需要配合代理设置处理

常见报错解决方案

错误1:403 Handshake Failed

现象 :客户端连接时立即断开
分析 :未通过握手验证,常见于:

  • 缺少必要认证头
  • 验证逻辑返回False后未及时close()
    解决
# 在拒绝连接时立即关闭
if not valid:
    await websocket.close(code=1008)
    return  # 必须立即返回

错误2:1006 Abnormal Closure

现象 :客户端非正常断开
处理方案

try:
    while True:
        data = await websocket.receive_text()
except WebSocketDisconnect as e:
    print(f"断开代码:{e.code}")

错误3:TypeError: 'str' expected

场景 :发送非文本数据时
正确做法

# 发送二进制数据
await websocket.send_bytes(binary_data)

# 发送文本数据
await websocket.send_text("message")

# 发送JSON
await websocket.send_json({"key": "value"})

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
,阅读完整的文章:如何在FastAPI中玩转WebSocket,让实时通信不再烦恼?

往期文章归档:

免费好用的热门在线工具

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13051.html

(0)
LomuLomu
上一篇 2025 年 8 月 4 日
下一篇 2025 年 8 月 5 日

相关推荐

  • 高效灵活!企业级IT资产配置管理数据库解决方案

    在现代企业IT运维中,基础设施规模庞大且变动频繁,传统管理方式往往难以应对复杂的资产配置需求。本文为您推荐一款模块化设计的运维配置管理数据库系统,它能有效提升企业IT团队对硬件设备和软件服务的管控效率。 产品概述 CMDB Pro是一款采用现代化架构的配置管理数据库,具备模型自定义和智能资源探测能力,专为解决企业级IT资产管理难题而设计。核心优势:- 智能探…

    2025 年 5 月 11 日
    16600
  • WebStorm激活失败后如何重置试用?图文流程说明

    申明:本教程 WebStorm 破解补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 ! WebStorm是 JetBrains 推出的开发编辑器,功能强大,适用于 Windows、Mac 和 Linux 系统。本文将详细介绍如何通过破解补丁实现永久激活,解锁所有高级功能。 不管你是什么版本、什么操…

    18小时前
    700
  • 【创新毕设】基于SpringBoot的校园二手交易系统设计与实现(附源码)支持多语言开发

    目录架构 研究背景与意义国内外研究综述论文框架说明系统可行性论证功能需求解析数据库设计方案核心功能实现系统测试方案 研究背景 在数字经济高速发展的当下,校园内闲置物品流转需求日益增长。传统交易模式存在信息不对称、交易效率低下等问题。本系统采用SpringBoot框架构建,通过线上平台实现二手物品的高效流通,既促进资源循环利用,又能培养学生环保意识。系统支持J…

    未分类 2025 年 5 月 19 日
    48200
  • 🚀 2025年最新IDEA激活码分享:永久破解IDEA终极教程(附破解补丁)

    💻 教程简介 本教程适用于JetBrains全家桶,包括IDEA、PyCharm、DataGrip、Goland等所有产品!无需繁琐操作,轻松实现永久激活至2099年!✨ 先给大家看看最新IDEA版本破解成功的实锤截图,有效期直达2099年,简直不要太爽! 📥 第一步:下载IDEA安装包 还没安装的小伙伴看这里!访问JetBrains官网:https://w…

    2025 年 6 月 7 日
    39800
  • Python数据结构与算法分析 第3版PDF、EPUB免费下载

    适读人群 :1. 希望学习数据结构和算法的Python用户; 2. 计算机专业的学生和老师。 只有洞彻数据结构与算法,才能真正精通Python!热门计算机科学教材,华盛顿大学、北京大学等多家高校采用,让你在代码编写的战场上所向披靡! 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: [美] 布拉德利·…

    2025 年 1 月 7 日
    51400

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信