You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tornado WebSocket异步包装器报错:NoneType不可用于await表达式

问题解答

为什么Tornado WebSocket的方法会返回NoneType?

Tornado的WebSocket模块采用可选异步的设计逻辑:部分内部方法(如帧处理回调、辅助逻辑方法)会根据实际场景返回不同类型的值:

  • 当需要执行异步操作(如IO等待、外部服务调用)时,返回可await的协程对象;
  • 当逻辑可以同步完成(如简单帧解析、无IO的本地处理)时,直接返回None,不需要触发异步等待。

你遇到的报错,是因为_receive_frame方法中尝试await handled_future,但这个handled_future来自某个同步处理逻辑,返回了None,导致await None触发TypeError。

而你给WebSocketHandler.get添加的异步包装器,默认假设原方法的返回值一定是可await对象,没有处理None或同步返回值的情况,因此触发了报错。

正确的异步包装器实现

你通过“检查是否为可await对象再await”的思路是正确的,以下是更规范的写法:

import inspect

def async_wrapper(original):
    async def wrapper(*args, **kwargs):
        print("websocket connection")
        result = original(*args, **kwargs)
        # 仅对可await对象执行await操作
        if inspect.isawaitable(result):
            result = await result
        return result
    return wrapper

这个实现兼容原方法返回可await对象或同步值(包括None)的场景,避免类型错误。


内容的提问来源于stack exchange,提问作者creater cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:24:53