ITADN
crossbario/autobahn-python
crossbario/autobahn-python · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Autobahn|Python

基于 Twisted 和 asyncio 的 Python WebSocket 与 WAMP。

PyPI Python CI CI (wstest) CD (wheels) CD (wheels-arm64) CD (wheels-docker) Docs License Downloads


快速链接: 源代码 - 文档 - WebSocket 示例 - WAMP 示例 社区: 论坛 - StackOverflow - Twitter - IRC #autobahn/chat.freenode.net 配套 项目: Autobahn|JS - Autobahn|Cpp - Autobahn|Testsuite - Crossbar.io - WAMP

简介

Autobahn|PythonAutobahn 的一个子项目,提供开源的

实现,适用于 Python 3.11+,并运行于 Twistedasyncio

您可以使用 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+。

特性


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 提供的四种 操作类型:

  1. 订阅 一个主题
  2. 发布 一个事件
  3. 注册 一个过程
  4. 调用 一个过程

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 项目:

*: 面向商业用户,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 在 PyPIGitHub 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 部分

  • accelerate:已弃用 - 请改用 NVX

压缩

Autobahn 通过 compress 可选依赖项支持多种 WebSocket 每消息压缩算法:

pip install autobahn[compress]

可用的压缩方法:

方法可用性标准实现备注
permessage-deflate始终可用RFC 7692Python 标准库 (zlib)标准 WebSocket 压缩
permessage-brotli[compress]RFC 7932brotli / 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 广泛采用

资源:

关于 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 的零拷贝序列化(内置)

架构与性能

序列化器依赖项针对 CPythonPyPy 均进行了优化:

序列化器CPythonPyPy轮子类型备注
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内置内置包含始终可用,无外部依赖

关键设计原则:

  1. 开箱即用:核心序列化器(JSON、MessagePack、CBOR、FlatBuffers)无需额外安装步骤即可使用;UBJSON 通过可选的 autobahn[serialization] 额外依赖提供
  2. PyPy 优化:纯 Python 实现利用 PyPy 的 JIT 获得卓越性能
  3. 二进制轮子:为所有主要平台提供原生轮子(Linux x86_64/ARM64、macOS x86_64/ARM64、Windows x86_64)
  4. 零系统污染:所有依赖项均可通过轮子或纯 Python 干净安装
  5. 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 支持。

所有依赖项均遵循以下设计原则:

  1. CFFI 优于 CPyExt:所有原生扩展均使用 CFFI 以获得最佳的 PyPy 兼容性
  2. 优先使用二进制 Wheel:为所有主要平台提供原生 wheel
  3. 针对 PyPy 优化:特定平台的软件包利用了 PyPy 的 JIT 编译器
  4. 零系统污染:安装时无需系统库或构建工具

核心依赖项

依赖项用途CPythonPyPyWheel 覆盖范围备注
txaioTwisted/asyncio 抽象层通用 wheel通用 wheel✅ 优秀纯 Python,适用于所有环境
cryptographyTLS、X.509、加密原语二进制 wheel (Rust+CFFI)二进制 wheel (Rust+CFFI)✅ 优秀每次发布包含 40 多个 wheel
hyperlinkURL 解析通用 wheel通用 wheel✅ 优秀纯 Python

WAMP 序列化器(开箱即用)

UBJSON 外,所有序列化器均默认包含在基础安装中;UBJSON 是一个可选的额外组件(pip install autobahn[serialization]):

序列化器用途CPythonPyPy轮子覆盖范围备注
jsonJSON 序列化stdlibstdlib✅ 始终可用Python 标准库
msgpackMessagePack 序列化msgpack (二进制轮子)u-msgpack-python (纯 Python)✅ 优秀CPython 有 50+ 个轮子;PyPy JIT 优化
ujson快速 JSON(可选)二进制轮子二进制轮子✅ 优秀30+ 个轮子;两种实现
cbor2CBOR 序列化 (RFC 8949)二进制轮子纯 Python 回退✅ 优秀30+ 个二进制轮子 + 通用回退
bjdataUBJSON 序列化 (可选)C 扩展(来自 sdist)❌ 不适用(仅限 CPython)⚠️ 仅 sdist — 无轮子autobahn[serialization] 额外依赖;引入 numpy。仅限 CPython:无法在 PyPy 上安装 (NeuroJSON/pybj#6)。在 CPython 上若无编译器,请设置 PYBJDATA_NO_EXTENSION=1。对于仅轮子/跨架构/PyPy 安装,建议优先使用 cbor/msgpack
flatbuffersGoogle Flatbuffers内置内置✅ 完美包含在我们的轮子中,零外部依赖

可选:Twisted 框架

可通过 pip install autobahn[twisted] 获取:

依赖项用途CPythonPyPy轮子覆盖范围备注
zope.interface组件架构二进制轮子二进制轮子✅ 优秀40+ 个轮子
twisted异步网络框架通用轮子通用轮子✅ 优秀纯 Python
attrs类属性通用轮子通用轮子✅ 优秀纯 Python

可选:WebSocket 压缩

可通过 pip install autobahn[compress] 使用:

压缩方法CPythonPyPy轮子覆盖范围标准备注
permessage-deflate标准库 (zlib)标准库 (zlib)✅ 始终可用RFC 7692Python 标准库
permessage-brotlibrotli (CPyExt)brotlicffi (CFFI)✅ 优秀RFC 793240+ 个轮子 (brotli),20+ 个轮子 (brotlicffi)
permessage-bzip2标准库 (bz2)标准库 (bz2)✅ 始终可用非标准Python 标准库
permessage-snappypython-snappy (可选)python-snappy (可选)⚠️ 无轮子非标准需手动安装;需要 libsnappy-dev

建议:使用 permessage-brotli 以获得最佳压缩效果并支持完整的二进制轮子。

可选:加密与 WAMP 身份验证

可通过 pip install autobahn[encryption] 使用:

依赖项用途CPythonPyPy轮子覆盖范围备注
pyopensslTLS/SSL 操作通用轮子通用轮子✅ 优秀纯 Python 封装
service-identityTLS 服务验证通用轮子通用轮子✅ 优秀纯 Python
pynaclNaCl 加密二进制轮子 (CFFI)二进制轮子 (CFFI)✅ 优秀30+ CFFI 轮子
pytrie前缀树数据结构通用轮子通用轮子✅ 优秀纯 Python
qrcode二维码生成通用轮子通用轮子✅ 优秀纯 Python
base58Base58 编码通用轮子通用轮子✅ 优秀纯 Python
ecdsaECDSA 签名通用轮子通用轮子✅ 优秀纯 Python

可选:WAMP-SCRAM 认证

可通过 pip install autobahn[scram] 获取:

依赖项用途CPythonPyPy轮子覆盖范围备注
cffiC 外部函数接口二进制轮子二进制轮子✅ 优秀40+ 轮子,包括 PyPy
argon2-cffiArgon2 密码哈希二进制轮子 (CFFI)二进制轮子 (CFFI)✅ 优秀30+ CFFI 轮子,包括 PyPy
passlib密码哈希框架通用轮子通用轮子✅ 优秀纯 Python

可选:原生向量扩展 (NVX)

可通过 pip install autobahn[nvx] 获取:

特性实现方式CPythonPyPy覆盖情况备注
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 实现了其目标:

  1. 开箱即用:所有核心 WAMP 序列化器默认提供
  2. CPython 与 PyPy:完全支持这两种实现
  3. 全面使用 CFFI:所有原生扩展均使用 CFFI(针对 PyPy 优化)
  4. 二进制 Wheel 包:跨平台/架构的全面覆盖
  5. 零系统依赖:在所有平台上均可通过 pip 干净安装
  6. 性能:原生 SIMD (NVX)、优化的序列化器、Brotli 压缩

没有更多可优化或期望之处 - 依赖策略已完整且最优。