当前位置: 首页 > news >正文

fastapi之WebSockets

文章目录

  • WebSockets
    • 基本概念
    • FastAPI 中的 WebSocket 支持
    • WebSocket 应用示例
      • 示例 1: 简单的 WebSocket 连接
        • 解释
      • 示例 2: 广播消息的 WebSocket 实现
        • 解释
      • 客户端代码示例
  • 完整示例
    • 项目结构
    • 服务器端代码 (main.py)
      • 解释
    • 简单的前端客户端 (static/index.html)
      • 解释
    • 测试
  • 相关代码资源
  • 总结

WebSockets

WebSockets 是一种在客户端和服务器之间建立持久双向连接的协议。与传统的 HTTP 请求-响应模型不同,WebSocket 允许服务器和客户端可以在连接建立后随时互相发送消息,这使得它非常适合需要实时通信的应用场景,如聊天应用、实时通知、协作编辑等。
FastAPI 内置对 WebSockets 的支持,使得开发实时应用程序变得简单而高效。

基本概念

  • **持久连接:**WebSocket 连接一旦建立,客户端和服务器可以在不需要重新建立连接的情况下多次发送和接收数据。
  • **双向通信:**服务器可以主动向客户端发送消息,客户端也可以主动向服务器发送消息,形成双向的通信通道。
  • **低延迟:**由于不需要为每次通信重新建立连接,WebSocket 通信的延迟较低,非常适合实时应用场景。

FastAPI 中的 WebSocket 支持

FastAPI 提供了对 WebSockets 的原生支持,你可以像定义 HTTP 路由一样定义 WebSocket 路由。

WebSocket 应用示例

示例 1: 简单的 WebSocket 连接

from fastapi import FastAPI, WebSocketapp = FastAPI()@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()  # 接受 WebSocket 连接while True:data = await websocket.receive_text()  # 接收客户端消息await websocket.send_text(f"Message text was: {data}")  # 发送消息给客户端
解释

@app.websocket("/ws"): 定义了一个 WebSocket 端点 /ws。
websocket: WebSocket: WebSocket 对象用于管理连接、接收和发送数据。
await websocket.accept(): 接受来自客户端的 WebSocket 连接请求。
await websocket.receive_text(): 等待接收来自客户端的文本消息。
await websocket.send_text(): 发送文本消息到客户端。

示例 2: 广播消息的 WebSocket 实现

from fastapi import FastAPI, WebSocket
from typing import Listapp = 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 Exception as e:manager.disconnect(websocket)
解释

ConnectionManager: 管理所有连接的类,负责接入、断开连接和广播消息。
manager.connect(): 接受新连接并将其添加到活动连接列表中。
manager.disconnect(): 从活动连接列表中移除断开的连接。
manager.broadcast(): 向所有活动连接发送消息。

客户端代码示例

const socket = new WebSocket("ws://localhost:8000/ws");socket.onmessage = function(event) {console.log("Message from server ", event.data);
};socket.onopen = function(event) {socket.send("Hello Server!");
};

完整示例

项目结构

WebSockets_/
│
├── main.py          # 主应用文件
├── static/
│   └── index.html   # 简单的前端客户端
├── requirements.txt # 依赖项
└── README.md        # 项目说明

服务器端代码 (main.py)

from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.staticfiles import StaticFiles
from typing import List
import uvicorn
import osapp = FastAPI()# Mount the static directory
app.mount("/static", StaticFiles(directory="static"), name="static")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)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)await manager.broadcast("A client disconnected")if __name__ == "__main__":uvicorn.run(f"{os.path.basename(__file__).split('.')[0]}:app",host="127.0.0.1",port=8000,reload=True,)

解释

  • ConnectionManager: 负责管理所有的 WebSocket 连接,包括连接、断开连接和消息广播。
  • ·/ws 端点·: 当客户端连接到这个端点时,会建立 WebSocket 连接。所有连接的客户端可以通过这个端点发送和接收消息。

简单的前端客户端 (static/index.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>
</head>
<body><h1>WebSocket Chat</h1><input id="messageInput" type="text" placeholder="Type a message..."><button onclick="sendMessage()">Send</button><ul id="messages"></ul><script>const ws = new WebSocket("ws://localhost:8000/ws");const messages = document.getElementById('messages');ws.onmessage = function(event) {const messageItem = document.createElement('li');messageItem.textContent = event.data;messages.appendChild(messageItem);};function sendMessage() {const input = document.getElementById("messageInput");ws.send(input.value);input.value = '';}</script>
</body>
</html>

解释

  • 简单的 HTML 页面使用 JavaScript 与 WebSocket 服务器通信。
  • 用户在输入框中输入消息并点击发送按钮后,消息会通过 WebSocket 发送到服务器,服务器再将消息广播给所有连接的客户端。

测试

  1. 浏览器进入http://127.0.0.1:8000/static/index.html
    然后输入消息 点击send
    在这里插入图片描述
    在这里插入图片描述
  2. 关闭网页之后
    在这里插入图片描述

相关代码资源

fastapi之WebSockets

总结

通过 FastAPI 的 WebSocket 支持,开发者可以轻松创建高效的实时应用程序。无论是简单的聊天应用,还是复杂的实时通知系统,FastAPI 提供了一个灵活而强大的平台来满足实时通信的需求。结合前端的 WebSocket API 和 FastAPI 的路由与连接管理功能,开发者可以快速构建现代化的实时交互式应用。

相关文章:

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...

Kotlin 和 Java区别

Kotlin 和 Java 是两种主要用于 Android 开发的编程语言&#xff0c;它们之间有一些关键的区别&#xff1a; 1. 语法简洁性&#xff1a; Kotlin&#xff1a;具有更简洁的语法&#xff0c;减少了冗余代码。例如&#xff0c;Kotlin 支持类型推断&#xff0c;避免了大量的样板…...

windows 达梦到ORACLE dblink

达梦通过DBLINK访问Oracle数据库有两种: 方式一&#xff1a;通过Oracle oci接口; 方式二&#xff1a;一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址&#xff1a;https://www.oracle.com/database/techno…...

大数据应用组件

1、数据存储1.1、hive->hdfs、mapredus1.2、ClickHouse1.3、Elasticsearch1.4、PostgreSQL1.5、HBase 2、数据抽取2.1、Kettle2.2、DataX2.3、Canal2.4、Flink CDC2.5、Sqoop2.6、Filebeat&Logstash(日志) 3、任务编排3.1、Apache DolphinScheduler 4、数据处理4.1、spa…...

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…...

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…...

08、MySQL-事务

目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c…...

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。...

LVS(Linux Virtual Server)

简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个高性能的开源负载均衡解决方案&#xff0c;它通过在Linux内核中实现IPVS&#xff08;IP Virtual Server&#xff09;模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上&#xff0c…...

回顾Python

一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y install …...

【数据结构】队列,你必须知道的内部原理!!!

&#x1f31e;&#x1f31e;&#x1f31e;生活本就沉闷&#xff0c;但跑起来就会有风 ~~~ 前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解数据结构队列的基础知识&#xff0c;希望你能帮到屏幕前的你。 &#x1f4da;️上期博客在这里&#xff1…...

Ubuntu24.04编译FFmpeg6.1(支持x264、x265、fdk-acc)

FFmpeg是一个开源的多媒体处理工具集&#xff0c;可以用于处理音频、视频和图片等多种媒体格式。由于其强大的功能和灵活性&#xff0c;FFmpeg被广泛应用在多媒体处理领域&#xff0c;包括音视频编解码、流媒体服务器、视频转码等。FFmpeg7.0 版本移除了 6.0 之前已弃用的 API&…...

顺序表-数据结构

一、结构定义 顺序表是通常是数组&#xff0c;要求数据连续存储。顺序表又分为定长顺序表和变长顺序表&#xff0c;本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…...

如何写出更优雅的并行程序?

如何写出更优雅的并行程序&#xff1f; 并行编程关于并行编程的一些理解 并行编程 并行编程是一种利用多个处理器或计算资源同时执行多个任务的编程方式&#xff0c;以提高计算效率和性能。允许程序员编写可以在多核处理器或多个计算机节点上同时执行的程序&#xff0c;以充分…...

C#中的Hangfire和Quartz.NET 任务调度的区别

Hangfire 和 Quartz.NET 是两种常见的 C# 任务调度库&#xff0c;它们有不同的特点和使用场景。以下是这两个库的详细对比&#xff0c;包括它们的主要功能、适用场景以及关键区别。 目录 Hangfire 主要功能 适用场景 示例代码 Quartz.NET 主要功能 适用场景 示例代码 …...

银行卡二三四要素验证-银行卡二三四要素验证接口-银行卡二三四要素

接口简介&#xff1a;全面覆盖&#xff0c;支持所有带银联标识的银行卡; 高准确性-验证结果实时返回&#xff0c;准确率达99%; 高稳定性-双通道自动切换&#xff0c;保证业务不间断; 专业服务-7*24小时服务&#xff0c;极速响应&#xff0c;为用户保驾护航; 接口地址&#xff1…...

C# 设计模式之命令模式

总目录 前言 命令模式在日常中&#xff0c;也是比较常见的&#xff0c;就比如&#xff1a;妈妈和爸爸说&#xff0c;你去让孩子把地扫一下&#xff1b;这就是是一个命令&#xff0c;命令中的 下达命令的是妈妈&#xff0c;传达命令的是爸爸&#xff0c;接受命令做事的是孩子&a…...

pod详解 list-watch机制 预选优选策略 如何指定节点调度pod

K8S是通过 list-watch 机制实现每个组件的协同工作 controller-manager、scheduler、kubelet 通过 list-watch 机制监听 apiserver 发出的事件&#xff0c;apiserver 也会监听 etcd 发出的事件 scheduler的调度策略&#xff1a; 预选策略&#xff08;Predicates&#xff09;…...

深入探索:【人工智能】、【机器学习】与【深度学习】的全景视觉之旅

目录 第一部分&#xff1a;人工智能、机器学习与深度学习概述 1.1 人工智能的概念与发展 代码示例&#xff1a;简单的AI决策系统 1.2 机器学习的定义与分类 代码示例&#xff1a;简单的线性回归模型 1.3 深度学习的基础与应用 代码示例&#xff1a;构建简单的神经网络 …...

使用js和css 实现div旋转围绕圆分布排列

记录&#xff0c;以防忘记 围绕圆 import React, { useEffect } from react; import ./index.scoped.scss;const Test () > {const arr Array.from({ length: 28 }, (_, index) > index 1);useEffect(() > {const dayTotal arr.length;// 动态设置每个点的旋转角…...

2025年短剧APP开发选型指南:uniApp混合开发 vs 安卓原生,哪个更适合你?

2025年短剧APP开发选型指南&#xff1a;uniApp混合开发 vs 安卓原生&#xff0c;哪个更适合你&#xff1f; 在短视频内容消费持续爆发的当下&#xff0c;微短剧作为一种新兴的内容形态正在迅速崛起。对于想要抓住这一风口的创业团队来说&#xff0c;技术选型往往成为第一个关键…...

RK3588与RK3399 USB DTS配置对比:升级平台时如何快速迁移和避坑

RK3588与RK3399 USB DTS配置深度对比&#xff1a;迁移实战指南 从RK3399升级到RK3588平台的开发者&#xff0c;往往会在USB功能配置上遇到意料之外的挑战。两代芯片虽然同属Rockchip产品线&#xff0c;但在USB架构设计、DTS节点定义和电源管理策略上存在显著差异。本文将带您深…...

解锁Windows全版本安装自由:MediaCreationTool.bat实战指南

解锁Windows全版本安装自由&#xff1a;MediaCreationTool.bat实战指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...

效率倍增:用快马平台自动化生成类qoderwork官网的高质量模板

在开发企业级工具类官网时&#xff0c;效率往往是团队最关注的核心指标之一。最近尝试用InsCode(快马)平台自动化生成类似qoderwork官网的模板&#xff0c;发现它能将传统需要数天的手动搭建过程压缩到几分钟内完成&#xff0c;这种效率提升对中小团队尤其有价值。以下是具体实…...

FlowState Lab 日志分析与性能调优实战

FlowState Lab 日志分析与性能调优实战 1. 为什么需要关注模型服务性能 当你把FlowState Lab模型部署上线后&#xff0c;可能会遇到这样的情况&#xff1a;请求量一大&#xff0c;响应就开始变慢&#xff0c;甚至出现超时。这时候就需要关注服务的性能表现。性能调优不是玄学…...

实战应用:基于快马定制企业级ventoy维护盘,集成系统修复与数据恢复工具

今天想和大家分享一个实战项目&#xff1a;如何用InsCode(快马)平台快速打造一个企业级Ventoy维护盘。这个方案特别适合IT技术支持人员&#xff0c;能大幅提升日常维护效率。 项目背景与需求分析 日常工作中经常遇到需要重装系统、重置密码、恢复数据等场景。传统PE工具功能单一…...

Pixel Aurora Engine实战应用:像素游戏道具图标(武器/药水/装备)批量生成

Pixel Aurora Engine实战应用&#xff1a;像素游戏道具图标&#xff08;武器/药水/装备&#xff09;批量生成 1. 像素游戏道具生成的痛点与解决方案 独立游戏开发者经常面临一个共同挑战&#xff1a;如何高效制作大量风格统一的像素艺术道具图标。传统手工绘制方式存在三个主…...

告别PX4,试试APM!用ArduPilot+Gazebo搭建你的第一个无人机仿真环境(附QGC地面站连接)

从PX4到APM&#xff1a;ArduPilot无人机仿真环境全攻略 如果你已经熟悉PX4生态&#xff0c;却对ArduPilot&#xff08;APM&#xff09;固件在仿真领域的表现充满好奇&#xff0c;这篇文章将为你打开一扇新的大门。不同于市面上大量聚焦PX4的教程&#xff0c;我们将深入探讨APM在…...

FinalBurn Neo技术指南:现代设备复刻街机厅沉浸体验全攻略

FinalBurn Neo技术指南&#xff1a;现代设备复刻街机厅沉浸体验全攻略 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 如何在现代设备上复刻街机厅的沉浸体验&#xff1f;FinalBurn Neo&#xff08;FBN…...

DNMSI2C轻量级声级计驱动库:IEC标准SPL数据采集

1. 项目概述DNMSI2C 是一款专为 DNMS Teensy 声音传感器模块设计的轻量级 IC 驱动库&#xff0c;面向嵌入式音频监测场景提供标准化、低开销的声压级&#xff08;SPL&#xff09;数据采集能力。该库不依赖浮点运算或动态内存分配&#xff0c;完全适配资源受限的微控制器平台&am…...