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
相关产品推荐
相关产品推荐

