首页 > 解决方案 > 使用来自复杂 API 调用的数据更新 Flask 页面的最佳实践方法是什么?

问题描述

我已经建立了一个网站来显示来自游戏 Destiny 2 的用户的一些相关信息。它目前在技术上可以正常运行并显示正确的数据,但由于它是在用户玩游戏时运行的,因此需要更新信息它呈现给用户。现在我让它每分钟通过 jQuery 重新加载页面,但我正在寻找有关如何正确执行此操作的指导。

这是一个使用 OAuth 2.0 和一点 jQuery 来提供附加功能的 Flask 站点。流程本质上是:用户单击主页上的“授权”按钮 -> 重定向到 Bungie 的站点以登录并授权应用程序 -> 使用相关的 OAuth 令牌/标头/等重定向回我的站点。-> Python 代码使用授权令牌对 Bungie 的 Destiny 2 API 进行大量调用(在某些情况下,获取更多令牌以进行进一步调用) -> 仅从这些调用中获取所需的数据并将其格式化为自定义字典 ​​->将其发送到 Flask 模板 -> 模板根据传递给它的数据使用 Jinja 生成所需的元素。显示的角色数据只是用户在三个游戏平台中的任何一个上拥有的每个角色的赏金和里程碑。当用户完成目标时,我需要更新完成百分比的视图。(例如“从 Mercury 收集资源。3/10”)

作为一个快速而肮脏的解决方案,我只是让页面自行重新加载,但这会创建一个大约 5-10 秒的烦人窗口,页面正在加载并且用户无法导航任何页面按钮,然后是明显的闪烁页面加载并且元素重新出现在视图中。这显然是不可接受的,所以我考虑了一些不同的选项,但我不确定如何在我的特定场景中实现它们。

AJAX

这似乎是最明显的解决方案(我从未使用过它),但据我所知,它需要调用特定的端点或 API。让 AJAX 对 Bungie 而不是 Flask 进行 API 调用似乎是不合理的,因为要进行许多调用并且它们需要 OAuth 令牌,有时还需要来自先前调用的信息。我已经考虑让我的 Python 代码将其最终的信息字典发送到我创建的新 Flask 端点(而不是模板),然后让 AJAX 调用该新端点以检索它所需的 JSON 信息。为此,Flask 必须在用户在页面上时每分钟在后台运行 Python 代码,这样 AJAX 调用才能获取最新信息。如果敏感的玩家数据位于您可以访问的端点上,这会产生任何安全风险吗?这是否会导致与同时登录的多个用户发生冲突,所有用户都发布到该端点?

Flask-SocketIO

我对此了解不多,但它似乎是服务器和客户端的一个很好的快速响应工具,但我再次想知道多个用户同时使用是否会出现安全/冲突问题?

烧瓶芹菜

同样,我对此知之甚少,但听起来它可能会起作用。也许 API 调用和数据处理在后台 Celery 任务中完成并发送到模板?但是,如何在不重新加载的情况下将这些数据无缝地显示在页面上(如 AJAX)?

JS Web 框架

我对 Angular 有一些经验,这就是我包含此部分的原因,因为它可以非常流畅地显示新信息并更新页面。Angular 控制器可以用来存储用户数据,然后在后台更新,从而自动更新视图吗?也可以在这里使用 React 或 Vue 之类的东西吗?

非常感谢您为这项工作选择和使用最佳工具的任何帮助!

标签: pythonajaxflask

解决方案


我个人会在这里使用 AJAX,因为它使用最广泛,因此如果您遇到困难,可以参考最好的文档。您提到您已经在使用 JQuery,这将使 AJAX 集成变得非常容易。我确信搜索“flask AJAX jquery”会给你一些好的结果。

我还建议发布您目前拥有的相关代码(Flask 端点/逻辑)。它肯定会帮助人们帮助你,并且通常是良好的 StackOverflow 礼仪。


推荐阅读