我正在寻找一个简单的(即,不是一个需要我设置一个单独的服务器来处理消息队列)的方法来对运行计算并生成图形的小型Web界面进行长轮询。这就是我的web界面需要做的事情:
由于计算都在服务器端完成,我不确定如何轻松设置它。显然,我想设置一个REST API来处理轮询,这在Flask中很容易。但是,我不确定如何检索实际更新。显而易见的是,虽然这个目的很复杂,但解决方案是设置消息传递队列并进行一些长轮询。但是,我不确定这是否是这种简单方法的正确方法。
这是我的问题:
我有一种感觉,我过于复杂,因为我知道这种事情在网络上很常见。我经常看到发生的事情,并且在进行某些计算时会运行一些“loading.gif”图像(例如,在Google Analytics中)。
谢谢你的帮助!
我使用Flask和jQuery构建了几个这样的应用程序。根据这些经验,我会说你的计划很好。
代码不仅仅是一个片段,所以我没有把它包含在这里,而是将一个简化的例子放到a Mercurial repository on bitbucket中,你可以自由地复习,复制或克隆。有三个部分:
serve.py
是一个基于Python / Flask的服务器templates/index.html
98%HTML,2%模板文件基于Flask的服务器将呈现为HTMLstatic/lpoll.js
是一个基于jQuery的客户端在对大多数浏览器进行简单,自然的Web套接字支持之前,以及在与Flask应用程序一起轻松集成之前,长轮询是一种合理的解决方法。但是在2013年中期,Web Socket支持已经走过了漫长的道路。
Here is an example,类似于上面的那个,但集成了Flask和Web Sockets。它运行在gevent和gevent-websocket的服务器组件之上。
请注意,此示例并非旨在成为Web Socket杰作。它保留了许多lpoll
结构,使它们更容易比较。但它立即提高了Web应用程序的响应能力,服务器开销和交互性。
Python 3.7+的更新
自最初回答5年以来,WebSocket变得更容易实现。从Python 3.7开始,异步操作已经成熟为主流实用性。 Python Web应用程序是完美的用例。他们现在可以像JavaScript和Node.js一样使用异步,留下了“并发性”的一些怪癖和复杂性。特别是,请查看Quart。它保留了Flask的API以及与许多Flask扩展的兼容性,但是启用了异步。一个关键的副作用是WebSocket连接可以与HTTP连接并行地优雅地处理。例如。:
from quart import Quart, websocket
app = Quart(__name__)
@app.route('/')
async def hello():
return 'hello'
@app.websocket('/ws')
async def ws():
while True:
await websocket.send('hello')
app.run()
Quart只是升级到Python 3.7的众多重要原因之一。