在调用Tornado服务器时保持AJAX请求活跃

1 投票
1 回答
971 浏览
提问于 2025-04-16 17:04

我正在尝试写我的第一个 Tornado 应用程序。
Tornado 的示例代码如下,但是似乎一旦 "MainHandler" 函数返回,客户端和这个服务器之间的连接就会断开。

我希望服务器能够持续推送数据,只要数据可用就发送。
怎么才能保持这个连接一直打开呢?

在客户端,我在考虑使用 ajax 调用。这样可以吗?
我以为一旦数据接收完,ajax 调用就结束了。

Facebook 确实说客户端会和服务器保持一个线程的连接,使用 Tornado,所以我知道这是可以做到的,我觉得我在某个简单的概念上卡住了……

import tornado.ioloop  
import tornado.web  
import time

class MainHandler(tornado.web.RequestHandler):  
    def get(self):  
        self.write("What happens after this call ?")  
    # while(True): time.sleep(5) <push more data># This would be ugly.. plus blocking(correct ?) 

application = tornado.web.Application([  
    (r"/", MainHandler),  
])

if __name__ == "__main__":    
    application.listen(8888)  
    tornado.ioloop.IOLoop.instance().start()  

我理解上缺少了什么呢?

1 个回答

3

如果你想保持连接一直打开,可以考虑使用websocket。你可以参考下面的内容:

LISTENERS = []

class RealtimeHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        LISTENERS.append(self)

    def on_close(self):
        LISTENERS.remove(self)

application = tornado.web.Application([
    (r'/', RealtimeHandler),
])

撰写回答