我正在寻找一种简单的(即不需要我设置单独的服务器来处理消息队列的方法)来对运行计算并生成图形的小型 Web 界面进行长轮询。这就是我的网络界面需要做的事情:
- 用户在网络界面中请求图表/数据
- 服务器运行一些计算。
- 当服务器运行计算时,一个小容器会根据计算进度进行更新(可能通过 AJAX/jQuery)(类似于您在带有 print 的控制台中执行的操作(即打印“计算密度函数...”))
- 计算完成并向用户显示图表。
由于计算全部在服务器端完成,我不太确定如何轻松设置它。显然,我想要设置一个 REST API 来处理轮询,这在 Flask 中很容易实现。但是,我不确定如何检索实际更新。一个明显但复杂的解决方案是设置一个消息队列并进行一些长轮询。但是,我不确定对于如此简单的事情来说这是否是正确的方法。
这是我的问题:
- 有没有办法使用文件系统来做到这一点?性能并不是一个大问题。 AJAX/jQuery 可以从文件中查找消息吗?将进度保存到某个 .json 文件中?
- 腌制呢? (我对pickle不太了解,但也许我可以pickle一个消息字典,并且它可以被处理轮询的API读取)。
- 民意调查是正确的方法吗?是否有更好或更常见的模式来处理这个问题?
我有一种感觉,我把事情变得过于复杂了,因为我知道这种事情在网络上很常见。我经常看到一些事情正在发生,并且在进行某些计算时正在运行一个小“loading.gif”图像(例如,在 Google Analytics 中)。
感谢您的帮助!
我仅使用 Flask 和 jQuery 构建了几个这样的应用程序。根据这次经验,我认为你的计划很好。
不要使用文件系统。您将遇到 JavaScript 安全问题/保护。万一您找到合理的解决方法,您仍然不会有任何可移植或可扩展的东西。相反,使用小型本地 Web 服务框架,例如 Flask。
不要腌制。使用 JSON。它是 Web 应用程序和 REST 界面的语言。 jQuery 和那些用于绘制图表、图形等的基于 jQuery 的优秀插件将需要 JSON。它易于使用、易于阅读,并且对于小型应用程序来说,没有理由去其他地方。
长轮询非常适合您想要完成的任务。纯基于 HTTP 的应用程序有一些限制。 WebSocket 和类似的套接字层(如 Socket.IO)“是未来”。但根据我的经验,找到好的、简单的服务器端实现示例非常困难。我认真看了有很多示例要求您设置 Node.js、REDIS 和其他中间件。但为什么我们要设置两三个独立的中间件服务器呢?这太可笑了。因此,在我看来,对像 Flask 这样的简单、纯 Python Web 框架进行长轮询是正确的选择。
该代码不仅仅是一个片段,因此我没有将其包含在此处,而是将一个简化的示例放入Bitbucket 上的 Mercurial 存储库 https://bitbucket.org/jeunice/lpoll/src您可以自由查看、复制或克隆。共有三个部分:
-
serve.py
基于 Python/Flask 的服务器
-
templates/index.html
基于 Flask 的服务器将呈现 98% HTML、2% 模板文件为 HTML
-
static/lpoll.js
基于 jQuery 的客户端
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)