Autobahn|Python
基于 Twisted 和 asyncio 的 Python WebSocket 与 WAMP。
快速链接: 源代码 - 文档 - WebSocket 示例 - WAMP 示例 社区: 论坛 - StackOverflow - Twitter - IRC #autobahn/chat.freenode.net 配套 项目: Autobahn|JS - Autobahn|Cpp - Autobahn|Testsuite - Crossbar.io - WAMP
简介
Autobahn|Python 是 Autobahn 的一个子项目,提供开源的
实现,适用于 Python 3.11+,并运行于 Twisted 和 asyncio。
您可以使用 Autobahn|Python 在 Python 中创建仅使用纯 WebSocket 或 WAMP 的客户端和服务器。
WebSocket 允许 Web 上的双向实时消息传递 以及更广泛的应用,而 WAMP 在 WebSocket 之上 增加了实时应用通信。
WAMP 为应用程序提供异步的 远程过程调用 和 发布与订阅,通过运行在 WebSocket 之上的 单一 协议实现。 WAMP 是一种 路由 协议,因此您需要一个 WAMP 路由器 来 连接基于 Autobahn|Python 的客户端。我们提供 Crossbar.io,但也有 其他选项 可用。
注意
Autobahn|Python 目前要求 Python 3.11 或更高版本。较早的 发布版本支持旧版 Python:v19.11.2 及之前版本支持 Python 2 和 3.4+,v20.7.1 及之前版本支持 Python 3.5+,v21.2.1 及之前版本支持 Python 3.6+。
特性
- WebSocket 和 WAMP 客户端和服务器的框架
- 运行于 CPython 和 PyPy <https://pypy.org/>
- 运行于 Twisted 和 asyncio - 实现 WebSocket RFC6455 和 Draft Hybi-10+
- 实现 WebSocket 压缩
- 实现 WAMP,即 Web 应用 消息协议
- 高性能、完全异步的实现
- 业界领先的规范符合性(在 Autobahn Testsuite 中 100% 严格通过: Client Server)
- 用于 WebSocket 的消息、帧和流式 API
- 支持 TLS(安全 WebSocket)和代理
- 开源 (MIT 许可证)
AI 政策
重要:关于 AI 辅助内容即将实施的政策变更说明
截至并包括版本 v25.6.1,本项目不包含任何由 AI 工具辅助生成的代码 或文档。此版本 代表了我们历史贡献政策下的最后一个发布版本。 从未来版本(在 v25.6.1 发布之后)开始,我们的贡献政策 将发生变更。后续发布版本可能包含 由 AI 辅助创建的代码或文档。
我们敦促所有用户和贡献者审阅我们的 AI 政策。 本文档详细说明了:
- 所有未来贡献所必须遵守的规则和保证。
- 对本项目及其用户可能产生的知识产权影响。
该政策是在一次公开社区讨论后制定的, 您可以在 GitHub issue #1663 上查看。
我们提供此透明通知,以便您做出 知情决策。如果我们的新 AI 政策与您自己的 (或您所在组织的)开发实践或风险承受能力不兼容,请在 决定是否升级到 v25.6.1 之后的版本时 将此因素纳入考量。
展示一些代码
为了给您留下初步印象,这里有两个示例。我们还有 更多 在仓库中。
WebSocket 回声服务器
这是一个简单的 WebSocket 回声服务器,它会回显收到的任何 WebSocket 消息:
from autobahn.twisted.websocket import WebSocketServerProtocol # 或者:from autobahn.asyncio.websocket import WebSocketServerProtocol
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("客户端正在连接:{}".format(request.peer))
def onOpen(self):
print("WebSocket 连接已打开。")
def onMessage(self, payload, isBinary):
if isBinary:
print("收到二进制消息:{} 字节".format(len(payload)))
else:
print("收到文本消息:{}".format(payload.decode('utf8')))
# 原样回显消息
self.sendMessage(payload, isBinary)
def onClose(self, wasClean, code, reason):
print("WebSocket 连接已关闭:{}".format(reason))
要实际运行上述服务器协议,你需要一些 样板代码。
WAMP 应用程序组件
下面是一个 WAMP 应用程序组件,它执行了 WAMP 提供的四种 操作类型:
- 订阅 一个主题
- 发布 一个事件
- 注册 一个过程
- 调用 一个过程
from autobahn.twisted.wamp import ApplicationSession # or: from autobahn.asyncio.wamp import ApplicationSession
class MyComponent(ApplicationSession):
@inlineCallbacks
def onJoin(self, details):
# 1. 订阅一个主题以接收事件
def onevent(msg):
print("Got event: {}".format(msg))
yield self.subscribe(onevent, 'com.myapp.hello')
# 2. 向一个主题发布事件
self.publish('com.myapp.hello', 'Hello, world!')
# 3. 注册一个过程以供远程调用
def add2(x, y):
return x + y
self.register(add2, 'com.myapp.add2')
# 4. 调用一个远程过程
res = yield self.call('com.myapp.add2', 2, 3)
print("Got result: {}".format(res))
上述代码通过更改一行(MyComponent 的基类)即可在 Twisted 和 asyncio 上运行。要实际运行上述应用程序组件,你需要一些
样板代码
和一个
WAMP 路由器。
打包
Autobahn|Python OSS 项目:
- 在 GitHub Releases 和 PyPI 上构建并发布 二进制 wheel
- 计划在 pyx 发布后在其上发布
- 计划在 WheelNext 发布后支持它(另见:https://lwn.net/Articles/1028299/, https://labs.quansight.org/blog/python-wheels-from-tags-to-variants)
- 不再构建并发布 Docker 镜像 *
- 不再明确支持 PyInstaller 打包
*: 面向商业用户,typedef int GmbH(德国),Autobahn、Crossbar.io 和 WAMP 的原始创建者及活跃维护者,提供基于 RHEL 9 和 Debian 12 的生产级、经过优化且受支持的 Docker 镜像,包括基于 CycloneDX v1.6 的完整 SBOM,格式为 JSON,并作为符合严格网络安全要求(例如针对 EU CRA 和 BSI TR-03183)的审计级 PDF/A 文档。
Package Releases
Autobahn|Python 在 PyPI 和 GitHub Releases 上发布源码发行版和预构建的 wheels。 当前发布线要求 Python 3.11 或更高版本,并为 CPython 3.11 至 3.14 以及 PyPy 3.11 发布 适用于受支持的 Linux、macOS 和 Windows 目标的 wheels。
推荐的安装方法是:
python -m pip install autobahn
Pip 将为你的 Python 实现、操作系统和 CPU 架构选择最匹配的 wheel。请参阅 wheels 清单 以了解支持的 wheel 矩阵和 NVX 加速说明。
扩展
网络框架
Autobahn 同时运行于 Twisted 和 asyncio 之上。要选择 相应的网络框架,请安装对应的 flavor:
asyncio:向后兼容的空操作。Asyncio 已包含在所有受支持的 Python 版本的标准库中。twisted:安装 Twisted 以及 Autobahn 中的 Twisted 支持
WebSocket 加速与压缩
加速(已弃用)
accelerate 可选依赖项不再推荐。Autobahn 现在包含 NVX(Native Vector Extensions),它使用 CFFI 为 WebSocket 操作(XOR 掩码和 UTF-8 验证)提供 SIMD 加速的原生代码。有关详细信息,请参阅下文 NVX 部分。
:已弃用 - 请改用 NVXaccelerate
压缩
Autobahn 通过 compress 可选依赖项支持多种 WebSocket 每消息压缩算法:
pip install autobahn[compress]
可用的压缩方法:
| 方法 | 可用性 | 标准 | 实现 | 备注 |
|---|---|---|---|---|
| permessage-deflate | 始终可用 | RFC 7692 | Python 标准库 (zlib) | 标准 WebSocket 压缩 |
| permessage-brotli | [compress] | RFC 7932 | brotli / brotlicffi | 推荐 - 最佳压缩比 |
| permessage-bzip2 | 可选 | 非标准 | Python 标准库 (bz2) | 需要构建时包含 libbz2 的 Python |
| permessage-snappy | 手动安装 | 非标准 | python-snappy | 需要单独安装 |
平台优化的 Brotli 支持:
Autobahn 包含 Brotli 压缩,并提供针对 CPython 和 PyPy 优化的完整二进制 wheel 覆盖:
- CPython:使用 brotli(Google 官方包,CPyExt)
- PyPy:使用 brotlicffi(基于 CFFI,针对 PyPy 优化)
Brotli 的优势:
- 与 deflate 或 snappy 相比具有更优的压缩率
- 支持所有主要平台的二进制轮子(Linux x86_64/ARM64, macOS x86_64/ARM64, Windows x86_64)
- IETF 标准(RFC 7932) 用于 HTTP 压缩
- 快速解压缩,适用于实时应用
- 被浏览器和 CDN 广泛采用
资源:
- RFC 7932 - Brotli 压缩数据格式
- Google Brotli - 官方实现
- brotlicffi - PyPy 的 CFFI 绑定
- PyPI: brotlicffi
- WAMP Brotli 扩展讨论
关于 Snappy 的说明:
Snappy 压缩可用,但需要手动安装 python-snappy(无二进制轮子):
pip install python-snappy # 需要 libsnappy-dev 系统库
对于大多数使用场景,由于具有更好的压缩率和包含的二进制轮子,推荐 Brotli 而非 Snappy。
加密与 WAMP 身份验证
Autobahn 支持通过 TLS(针对 WebSocket 及所有 WAMP 传输层)运行,同时也支持 WAMP-cryposign 身份验证。
要安装,请使用此 flavor:
encryption:安装 TLS 和 WAMP-cryptosign 依赖项
Autobahn 还支持 WAMP-SCRAM 身份验证。要安装:
scram:安装 WAMP-SCRAM 依赖项
原生向量扩展 (NVX)
> 这尚未完成 - 阿尔法版!
Autobahn 包含 NVX,一个网络加速器库, 为 WebSocket (XOR 掩码) 和 UTF-8 验证提供 SIMD 加速的原生向量代码。
NVX 位于命名空间 autobahn.nvx 中,目前 需要至少支持 SSE2 的 x86-86 CPU,并在可用时使用 SSE4.1。代码使用向量 内在函数编写,应能在 GCC 和 Clang 上编译, 并通过 CFFI 与 Python 接口交互,因此在 PyPy 上运行速度很快。
WAMP 序列化器
JSON、MessagePack、CBOR 和 FlatBuffers 序列化器默认包含在内 - 开箱即用!UBJSON 可通过可选的 autobahn[serialization] 额外组件获取。
Autobahn|Python 附带以下 WAMP 序列化器:
- JSON(标准库)- 始终可用
- MessagePack - 高性能二进制序列化
- CBOR - IETF 标准二进制序列化(RFC 8949)
- UBJSON - 通用二进制 JSON (可选:
pip install autobahn[serialization]) - Flatbuffers - Google 的零拷贝序列化(内置)
架构与性能
序列化器依赖项针对 CPython 和 PyPy 均进行了优化:
| 序列化器 | CPython | PyPy | 轮子类型 | 备注 |
|---|---|---|---|---|
| json | 标准库 | 标准库 | - | 始终可用 |
| msgpack | 二进制轮子(C 扩展) | u-msgpack-python(纯 Python) | 原生 + 通用 | PyPy JIT 使纯 Python 比 C 更快 |
| ujson | 二进制轮子 | 二进制轮子 | 原生 | 两种实现均可用 |
| cbor2 | 二进制轮子 | 纯 Python 回退 | 原生 + 通用 | 二进制轮子 + py3-none-any |
| ubjson (可选) | C 扩展(来自 sdist) | ❌ 不适用(仅限 CPython) | 仅源码 — 无轮子 | 可选 autobahn[serialization] 额外依赖(bjdata,引入 numpy)。仅限 CPython:bjdata 无法在 PyPy 上安装(NeuroJSON/pybj#6);在 PyPy 上使用 cbor/msgpack。在 CPython 中若无编译器,请设置 PYBJDATA_NO_EXTENSION=1 |
| flatbuffers | 内置 | 内置 | 包含 | 始终可用,无外部依赖 |
关键设计原则:
- 开箱即用:核心序列化器(JSON、MessagePack、CBOR、FlatBuffers)无需额外安装步骤即可使用;UBJSON 通过可选的
autobahn[serialization]额外依赖提供 - PyPy 优化:纯 Python 实现利用 PyPy 的 JIT 获得卓越性能
- 二进制轮子:为所有主要平台提供原生轮子(Linux x86_64/ARM64、macOS x86_64/ARM64、Windows x86_64)
- 零系统污染:所有依赖项均可通过轮子或纯 Python 干净安装
- WAMP 合规性:开箱即用的完整协议支持
总附加大小:约 590KB(与完整应用程序安装相比可忽略不计)
平台覆盖
所有序列化依赖项均提供二进制 wheel 包,支持:
- Linux:x86_64、ARM64(manylinux、musllinux)
- macOS:x86_64(Intel)、ARM64(Apple Silicon)
- Windows:x86_64(AMD64)、ARM64
- Python:3.11、3.12、3.13、3.14(包括 3.14t 自由线程版)
- 实现:CPython、PyPy 3.11+
向后兼容性
serialization 可选依赖项为保持向后兼容性而保留:
pip install autobahn[serialization] # 仍然有效,但现在是一个空操作
ujson 加速
为了在 CPython 上使用更快的 ujson 来加速 JSON,请设置:
AUTOBAHN_USE_UJSON=1
警告:使用
ujson将破坏 Autobahn 在 WAMP 中透明传输和转换二进制应用程序负载的能力。此能力依赖于标准库json模块中在ujson中不可用的特性。
建议
- 通用用途:JSON(标准库)或 CBOR
- 高性能:MessagePack 或 Flatbuffers
- 严格标准:CBOR(IETF RFC 8949)
- 零拷贝:Flatbuffers(用于大型负载)
依赖分析
Autobahn|Python 已针对 CPython 和 PyPy 进行了全面优化,并提供了全面的二进制 wheel 支持。
所有依赖项均遵循以下设计原则:
- CFFI 优于 CPyExt:所有原生扩展均使用 CFFI 以获得最佳的 PyPy 兼容性
- 优先使用二进制 Wheel:为所有主要平台提供原生 wheel
- 针对 PyPy 优化:特定平台的软件包利用了 PyPy 的 JIT 编译器
- 零系统污染:安装时无需系统库或构建工具
核心依赖项
| 依赖项 | 用途 | CPython | PyPy | Wheel 覆盖范围 | 备注 |
|---|---|---|---|---|---|
| txaio | Twisted/asyncio 抽象层 | 通用 wheel | 通用 wheel | ✅ 优秀 | 纯 Python,适用于所有环境 |
| cryptography | TLS、X.509、加密原语 | 二进制 wheel (Rust+CFFI) | 二进制 wheel (Rust+CFFI) | ✅ 优秀 | 每次发布包含 40 多个 wheel |
| hyperlink | URL 解析 | 通用 wheel | 通用 wheel | ✅ 优秀 | 纯 Python |
WAMP 序列化器(开箱即用)
除 UBJSON 外,所有序列化器均默认包含在基础安装中;UBJSON 是一个可选的额外组件(pip install autobahn[serialization]):
| 序列化器 | 用途 | CPython | PyPy | 轮子覆盖范围 | 备注 |
|---|---|---|---|---|---|
| json | JSON 序列化 | stdlib | stdlib | ✅ 始终可用 | Python 标准库 |
| msgpack | MessagePack 序列化 | msgpack (二进制轮子) | u-msgpack-python (纯 Python) | ✅ 优秀 | CPython 有 50+ 个轮子;PyPy JIT 优化 |
| ujson | 快速 JSON(可选) | 二进制轮子 | 二进制轮子 | ✅ 优秀 | 30+ 个轮子;两种实现 |
| cbor2 | CBOR 序列化 (RFC 8949) | 二进制轮子 | 纯 Python 回退 | ✅ 优秀 | 30+ 个二进制轮子 + 通用回退 |
| bjdata | UBJSON 序列化 (可选) | C 扩展(来自 sdist) | ❌ 不适用(仅限 CPython) | ⚠️ 仅 sdist — 无轮子 | autobahn[serialization] 额外依赖;引入 numpy。仅限 CPython:无法在 PyPy 上安装 (NeuroJSON/pybj#6)。在 CPython 上若无编译器,请设置 PYBJDATA_NO_EXTENSION=1。对于仅轮子/跨架构/PyPy 安装,建议优先使用 cbor/msgpack |
| flatbuffers | Google Flatbuffers | 内置 | 内置 | ✅ 完美 | 包含在我们的轮子中,零外部依赖 |
可选:Twisted 框架
可通过 pip install autobahn[twisted] 获取:
| 依赖项 | 用途 | CPython | PyPy | 轮子覆盖范围 | 备注 |
|---|---|---|---|---|---|
| zope.interface | 组件架构 | 二进制轮子 | 二进制轮子 | ✅ 优秀 | 40+ 个轮子 |
| twisted | 异步网络框架 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
| attrs | 类属性 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
可选:WebSocket 压缩
可通过 pip install autobahn[compress] 使用:
| 压缩方法 | CPython | PyPy | 轮子覆盖范围 | 标准 | 备注 |
|---|---|---|---|---|---|
| permessage-deflate | 标准库 (zlib) | 标准库 (zlib) | ✅ 始终可用 | RFC 7692 | Python 标准库 |
| permessage-brotli | brotli (CPyExt) | brotlicffi (CFFI) | ✅ 优秀 | RFC 7932 | 40+ 个轮子 (brotli),20+ 个轮子 (brotlicffi) |
| permessage-bzip2 | 标准库 (bz2) | 标准库 (bz2) | ✅ 始终可用 | 非标准 | Python 标准库 |
| permessage-snappy | python-snappy (可选) | python-snappy (可选) | ⚠️ 无轮子 | 非标准 | 需手动安装;需要 libsnappy-dev |
建议:使用 permessage-brotli 以获得最佳压缩效果并支持完整的二进制轮子。
可选:加密与 WAMP 身份验证
可通过 pip install autobahn[encryption] 使用:
| 依赖项 | 用途 | CPython | PyPy | 轮子覆盖范围 | 备注 |
|---|---|---|---|---|---|
| pyopenssl | TLS/SSL 操作 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python 封装 |
| service-identity | TLS 服务验证 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
| pynacl | NaCl 加密 | 二进制轮子 (CFFI) | 二进制轮子 (CFFI) | ✅ 优秀 | 30+ CFFI 轮子 |
| pytrie | 前缀树数据结构 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
| qrcode | 二维码生成 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
| base58 | Base58 编码 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
| ecdsa | ECDSA 签名 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
可选:WAMP-SCRAM 认证
可通过 pip install autobahn[scram] 获取:
| 依赖项 | 用途 | CPython | PyPy | 轮子覆盖范围 | 备注 |
|---|---|---|---|---|---|
| cffi | C 外部函数接口 | 二进制轮子 | 二进制轮子 | ✅ 优秀 | 40+ 轮子,包括 PyPy |
| argon2-cffi | Argon2 密码哈希 | 二进制轮子 (CFFI) | 二进制轮子 (CFFI) | ✅ 优秀 | 30+ CFFI 轮子,包括 PyPy |
| passlib | 密码哈希框架 | 通用轮子 | 通用轮子 | ✅ 优秀 | 纯 Python |
可选:原生向量扩展 (NVX)
可通过 pip install autobahn[nvx] 获取:
| 特性 | 实现方式 | CPython | PyPy | 覆盖情况 | 备注 |
|---|---|---|---|---|---|
| XOR 掩码 | 通过 CFFI 使用 SIMD | ✅ 是 | ✅ 是 | ✅ 优秀 | 我们自己的基于 CFFI 的实现 |
| UTF-8 验证 | 通过 CFFI 使用 SIMD | ✅ 是 | ✅ 是 | ✅ 优秀 | 我们自己的基于 CFFI 的实现 |
NVX 通过 CFFI 使用 SIMD 指令,为 WebSocket 操作提供了显著的性能提升。
平台覆盖摘要
提供二进制 wheel 包的平台:
- 操作系统:Linux (glibc/musl)、macOS、Windows
- 架构:x86_64 (Intel/AMD)、ARM64 (Apple Silicon, AWS Graviton)
- Python 版本:3.11、3.12、3.13、3.14(包括 free-threaded 3.14t)
- 实现:CPython、PyPy 3.11+
所有可选依赖项均可干净安装,无需:
- 系统库(除可选的 python-snappy 外)
- 构建工具(gcc、make 等)
- 包管理器(apt、yum、brew)
结论
✅ Autobahn|Python 实现了其目标:
- ✅ 开箱即用:所有核心 WAMP 序列化器默认提供
- ✅ CPython 与 PyPy:完全支持这两种实现
- ✅ 全面使用 CFFI:所有原生扩展均使用 CFFI(针对 PyPy 优化)
- ✅ 二进制 Wheel 包:跨平台/架构的全面覆盖
- ✅ 零系统依赖:在所有平台上均可通过 pip 干净安装
- ✅ 性能:原生 SIMD (NVX)、优化的序列化器、Brotli 压缩
没有更多可优化或期望之处 - 依赖策略已完整且最优。