一尘不染

Python(和Flask)中的非消息队列/简单长轮询

flask

正在寻找一种简单的方法(即,不需要我设置单独的服务器来处理消息队列的方法)来对运行计算并生成图形的小型Web界面进行长轮询。这是我的网络界面需要执行的操作:

  1. 用户在Web界面中请求图形/数据
  2. 服务器运行一些计算。
  3. 当服务器运行计算时,将随计算进度更新一个小容器(可能通过AJAX / jQuery)(类似于您在使用consol进行打印时所做的操作(即打印“计算密度函数…”))
  4. 计算完成并向用户显示图形。
    由于计算都是在服务器端完成的,因此我不确定如何轻松地进行设置。显然,我想设置一个REST API来处理轮询,这在Flask中很容易。但是,我不确定如何检索实际更新。尽管为此目的很复杂,但一个显而易见的解决方案是设置消息传递队列并进行一些长时间的轮询。但是,我不确定这种简单的方法是否正确。

这是我的问题:

  1. 有没有办法使用文件系统来做到这一点?性能不是一个大问题。AJAX / jQuery可以从文件中查找消息吗?将进度保存到一些.json文件?
  2. 酸洗呢 (我对酸洗的了解不多,但是也许我可以对消息字典进行酸洗,并且可以由处理轮询的API读取)。
  3. 轮询是否是正确的方法?是否有更好或更通用的模式可以解决此问题?
    我知道我在网络上很常见这种事情,所以我觉得事情太复杂了。在进行一些计算时(例如,在Google Analytics(分析)中),我经常会看到发生的事情并且正在运行一个小的“ loading.gif”图像。

阅读 1117

收藏
2020-04-07

共1个答案

一尘不染

我仅使用Flask和jQuery构建了几个类似的应用程序。根据这些经验,我会说你的计划很好。

  1. Do not use the filesystem。你将遇到JavaScript安全性问题/保护措施。在极少数情况下,你会找到合理的解决方法,但仍然没有任何可移植或可扩展的功能。相反,请使用像Flask这样的小型本地Web服务框架。

  2. Do not pickle。使用JSON。这是Web应用程序和REST界面的语言。jQuery和用于绘制图表,图形等的漂亮的基于jQuery的插件将期望使用JSON。它易于使用,易于阅读,对于小型应用程序,没有理由去其他任何地方。

  3. Long-polling is fine for what you want to accomplish。基于纯HTTP的应用程序有一些限制。WebSockets和类似Socket.ish的类似Socket层“是未来”。但是,以我的经验,要找到好的,简单的服务器端实现示例很困难。我好辛苦 有很多示例希望你设置Node.js,REDIS和其他中间件。但是,为什么我们必须设置两个或三个单独的中间件服务器?太可笑了 因此,在简单的纯Python网络框架(例如Flask)上进行长时间轮询是IMO的方法。

该代码不只是一小段代码,因此,我没有在此处包括它,而是将一个简化的示例放入了bitbucket上的Mercurial存储库中,你可以自由查看,复制或克隆。分为三个部分:

  • serve.py 一个基于Python / Flask的服务器
  • templates/index.html 基于Flask的服务器将98%HTML,2%模板文件呈现为HTML
  • static/lpoll.js 一个基于jQuery的客户端
2020-04-07