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

2024-01-10

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

  1. 用户在网络界面中请求图表/数据
  2. 服务器运行一些计算。
  3. 当服务器运行计算时,一个小容器会根据计算进度进行更新(可能通过 AJAX/jQuery)(类似于您在带有 print 的控制台中执行的操作(即打印“计算密度函数...”))
  4. 计算完成并向用户显示图表。

由于计算全部在服务器端完成,我不太确定如何轻松设置它。显然,我想要设置一个 REST API 来处理轮询,这在 Flask 中很容易实现。但是,我不确定如何检索实际更新。一个明显但复杂的解决方案是设置一个消息队列并进行一些长轮询。但是,我不确定对于如此简单的事情来说这是否是正确的方法。

这是我的问题:

  1. 有没有办法使用文件系统来做到这一点?性能并不是一个大问题。 AJAX/jQuery 可以从文件中查找消息吗?将进度保存到某个 .json 文件中?
  2. 腌制呢? (我对pickle不太了解,但也许我可以pickle一个消息字典,并且它可以被处理轮询的API读取)。
  3. 民意调查是正确的方法吗?是否有更好或更常见的模式来处理这个问题?

我有一种感觉,我把事情变得过于复杂了,因为我知道这种事情在网络上很常见。我经常看到一些事情正在发生,并且在进行某些计算时正在运行一个小“loading.gif”图像(例如,在 Google Analytics 中)。

感谢您的帮助!


我仅使用 Flask 和 jQuery 构建了几个这样的应用程序。根据这次经验,我认为你的计划很好。

  1. 不要使用文件系统。您将遇到 JavaScript 安全问题/保护。万一您找到合理的解决方法,您仍然不会有任何可移植或可扩展的东西。相反,使用小型本地 Web 服务框架,例如 Flask。

  2. 不要腌制。使用 JSON。它是 Web 应用程序和 REST 界面的语言。 jQuery 和那些用于绘制图表、图形等的基于 jQuery 的优秀插件将需要 JSON。它易于使用、易于阅读,并且对于小型应用程序来说,没有理由去其他地方。

  3. 长轮询非常适合您想要完成的任务。纯基于 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(使用前将#替换为@)

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

随机推荐

  • BigQuery 中的查询命中和自定义维度?

    我正在 BigQuery 中处理 GoogleAnalytics 数据 我想输出 2 列 特定事件操作 点击 和自定义维度 基于会话 所有这一切 都使用标准 SQL 我不知道如何正确地做到这一点 文档也没有帮助 请帮我 这就是我正在尝试的
  • 最长正和子串

    我想知道如何获得序列中最长的正和子序列 例如 我有 6 3 4 4 5 所以最长的正子序列是 3 4 4 事实上 总和是正数 3 我们不能添加 6 和 5 否则它会变成消极的 它可以很容易地在 O N 2 中解决 我认为可能存在更快的东西
  • 为什么我的 Ansible 脚本不使用其最顶层目录归档文件?

    我正在编写一个 Ansible 脚本来根据文件类型 创建前的天数等来归档文件 及其目录结构 为了选择文件类型 我正在使用find命令 然后将所有文件放入列表中 使用set fact模块 之后 我将此列表提供给存档模块archive 但我的问
  • 用数组重载运算符

    我有这个单位 unit Main TIns interface type TIns record private type TInsArray array 0 90 of Integer var FInsArray TInsArray pu
  • URI 中的 HTML 字符出现 WebClient.DownloadFile 404 错误?

    我正在使用 WebClient 类从网站下载文件 但有几个问题 当 URI 的 URI 路径中包含 HTML 字符时 例如http foo com path1 http foo com path1 amp path2 pdf 我收到 404
  • Heroku Repo 大小和 Slug 大小随着每次部署而增加。为什么?

    我更改了应用程序中的一些文本并使用以下命令部署新版本 git push heroku master 但每次我推动时 它都会增加很多 我在这里写下每次部署后的增量 168 2 KB 37 9 MB 178 6 KB 38 7 MB 187 K
  • 如何检查哪些优惠券适用于 WooCommerce 中的哪些产品?

    由于我们可以为订单中的每个产品应用不同的优惠券 有什么方法可以知道哪些优惠券适用于哪些产品 我用过 order gt get used coupons 函数 但它只返回使用过的优惠券代码 请帮忙解决 谢谢 2016 年 6 月为 Wooco
  • Python中有标签/goto吗?

    有没有goto或者 Python 中的任何等效项能够跳转到特定的代码行 不 Python 不支持标签和 goto 它是一种 高度 结构化的编程语言
  • 如何使用 OkHttp/Retrofit 重试 HTTP 请求?

    我在我的 Android 项目中使用 Retrofit OkHttp 1 6 我没有找到任何内置的请求重试机制 在搜索更多内容时 我读到 OkHttp 似乎有静默重试 我没有看到我的任何连接 HTTP 或 HTTPS 上发生这种情况 如何使
  • 如何使水平ScrollView的内容水平居中?

    我有一个水平 ScrollView 其中有一个 HStack 如下所示 ScrollView horizontal HStack Circle frame width 60 height 60 使用此代码 HStack 的内容与屏幕左侧对齐
  • 使用 preg_match 从字符串中获取数字[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个字符串 div 我只想使用此
  • Xstream 映射 XML 的“选择”元素

    我需要使用 XStream 将受 XSD 约束的 XML 映射到 Java 对象 XSD 有 4 个复杂类型元素 它们是 选择 元素 即这 4 个元素之一可以出现在根标记下的 XML 中 我一直在研究 XStream 但在我看来 要映射这样
  • Eclipse - 动态 Web 项目未拾取 jsp 中的更改或

    我正在使用 运行方式 gt 在服务器上运行 在本地 tomcat 实例上运行我的 Web 项目 问题是 当我对 JSP 和其他项目组件进行更改时 Eclipse 有时会选择此更改 有时则不会 看起来有点随机 这可能是由于多种原因造成的 在不
  • 如何将视图叠加到 CVImageBuffer 内的每个捕获的帧上,实时而不是后期处理

    我已经成功设置了一个基本的AVCaptureSession它通过使用录制视频并将其保存在设备上AVCaptureFileOutputRecordingDelegate 我一直在搜索文档以了解如何在正在录制的视频之上添加统计信息叠加 i e
  • HTTP 请求之间具有持久状态的模型

    我想创建一个具有在 HTTP 请求之间持续存在的模型的 Web 应用程序 据我了解 像 PHP 这样的语言将每个 HTTP 请求视为一个全新的连接 除了一些全局变量 如 SESSION 因此 每次用户更改页面时 我的所有 PHP 类都会再次
  • 来自 TeamCity 的 MSBuild 的 /P MSDeploy 参数的完整列表

    我目前使用 TeamCity 中的 MSBuild 运行程序在本地服务器上进行持续集成 效果非常好 但是 我无法以 TeamCity 期望的格式找到 MSDeploy 支持的命令行开关的完整列表 目前 在我的 参数 部分中 我使用以下开关
  • 语法错误:错误:无法加载配置“@vue/prettier”以扩展

    I am working on a project with vuejs add vuetify I install dhe plugin prettier after that I made configure in file packa
  • 错误:AADSTS90015:请求的查询字符串太长(在执行 ADFS 时)

    我正在进行 ADFS 身份验证 当我单击Sign In从 Microsoft Teams 按钮 我将被重定向到我的 URL 页面重定向后出现以下错误 AADSTS90015 请求的查询字符串太长 我尝试过以下解决方案 HTTP 错误 414
  • 调试多个 iOS 设备时 XCode 5 崩溃 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近 我使用 XCode 4 为 iOS 网络项目同时调试了多达 4 个设备 今天更新到 XCode 5 以便能够构建 iOS7 设备 我
  • Python(和 Flask)中的非消息队列/简单长轮询

    我正在寻找一种简单的 即不需要我设置单独的服务器来处理消息队列的方法 来对运行计算并生成图形的小型 Web 界面进行长轮询 这就是我的网络界面需要做的事情 用户在网络界面中请求图表 数据 服务器运行一些计算 当服务器运行计算时 一个小容器会