tornado 只能升级到 websocket 错误
Posted
技术标签:
【中文标题】tornado 只能升级到 websocket 错误【英文标题】:tornado can upgrade only to websocket error 【发布时间】:2015-10-05 08:39:09 【问题描述】:我正在使用龙卷风进行实时应用。我为此使用redis。
当我访问 url 127.0.0.1:8888/2/
其中 2 是我的用户 ID 时,我收到错误消息 can "Upgrade" only to websocket
。
我不知道为什么会收到此错误。出现此错误是因为我的代码或 websocket 的一些问题?
在我的 javascript 上,我正在做 ws = new WebSocket("ws://127.0.0.1:8888/" + user_id + "/");
当我执行127.0.0.1:8888
时,它会打印我在 RequestHandler 的 get() 函数中打印的内容
需要建议
【问题讨论】:
您的处理程序类是否扩展了tornado.websocket.WebSocketHandler
类?
是的,它确实扩展了..
您在描述中的路线是否有斜杠/
?对我来说,看起来路线不匹配。您也可以在问题中发布您的 Python 代码。
您使用的是哪个浏览器?你能在get()
或prepare()
中打印self.request.headers.get("Upgrade")
的值吗?
【参考方案1】:
这是 Tornado 的 GET 方法处理 WebSockets 的开始:
@tornado.web.asynchronous
def get(self, *args, **kwargs):
self.open_args = args
self.open_kwargs = kwargs
# Upgrade header should be present and should be equal to WebSocket
if self.request.headers.get("Upgrade", "").lower() != 'websocket':
self.set_status(400)
self.finish("Can \"Upgrade\" only to \"WebSocket\".")
return
因此,您收到的错误消息是由于您的请求中缺少“升级”标头造成的,当您在浏览器中简单地获取 URL 时看到此消息时,这并不是错误。但是,如果您使用您提供的 JS 代码然后运行 ws.send("message")
,您应该能够在 Tornado WebSocketHandler 中捕获并处理此消息:
def on_message(self, message):
print(message) # print the message to a standard output
self.write_message(message) # throw it back to client
【讨论】:
如何更改/点击/修改/重载这个@tornado.web.asynchronous 函数?【参考方案2】:我在 Tornado 中尝试创建 WebSocket 时遇到了同样的错误消息。我在网上找到的所有答案(包括这里)都是准确的,但并没有解决我遇到的问题。
我终于意识到,由于我在 nginx 后面运行我的 Tornado 服务器,这与我的 Python 或 JavaScript 程序无关。相反,这是一个服务器配置问题。
我通过正确配置我的 nginx 服务器 using information from their site 找到了我的解决方案。
如果有人遇到同样的问题,我想建议您同时检查任何适用的错误配置服务器或负载平衡器设置。
【讨论】:
以上是关于tornado 只能升级到 websocket 错误的主要内容,如果未能解决你的问题,请参考以下文章
tornado+websocket+mongodb实现在线视屏文字聊天
如何在 Tornado 中创建多个 websocket 聊天?
同时使用 Python Tornado 后端、WebSocket 监听器和 MQTT 客户端