【问题标题】:Is there a way to pass a Python variable to Javascript without writing it to a file?有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?
【发布时间】:2019-10-30 02:29:00
【问题描述】:

假设我有一个简单的 Python 变量,如下所示:

x = 5

我想创建一个网页,该网页使用 javascript 来进一步处理该变量,在同一台计算机(Raspberry Pi)上运行。

<!DOCTYPE html>
<html>
<body>

<script>
document.write(x);
</script>

</body>
</html>

因为 Raspberry Pi 使用 micro SD 卡,所以我想限制读/写周期数。有没有办法将这个 Python 变量存储在 Javascript 代码可以访问的内存中(或其他方式)?

我知道有些人会建议用 Javascript 重写 Python 代码,但我已经有一个大型 Python 程序,由于时间和创建它所涉及的原始工作,我不想重写它。如果你很好奇,我正在使用 Javascript 来显示带有 Highcharts 的数据——这对于我的项目来说是首选。

【问题讨论】:

  • 你在使用任何python框架吗?像 Django 或 Flask...
  • 我同意某些上下文可能有助于更好地解决问题。
  • 不,我对这两个框架都不熟悉。也许是时候学习了。

标签: javascript python


【解决方案1】:

几个想法:

  1. 在您的 Python 应用程序中运行一个 Web 服务器并公开一个返回该数据的端点。在您的 Javascript 应用程序中,调用此 API(可通过 0.0.0.0 访问)并使用数据。警告:您必须在 Python 应用中设置网络服务器并保持其运行。

这是一个更好的主意:

  1. 在您的 Pi 上运行 Redis 实例。 Redis 是一个内存缓存提供程序,您可以将其配置为不将任何数据持久化到磁盘。因此,它将成为您的 Python 和 Javascript 应用程序之间的内存代理。 Redis 在您的 Pi 上作为本地 Web 服务器运行,并公开用于写入和读取数据的端点。从您的 Python 应用程序调用 Redis 端点以写入一些数据,并从您的 Javascript 应用程序调用 Redis 以读取您需要的内容。

https://redis.io/topics/ARM

【讨论】:

  • 我喜欢有一个中间选项的方法,它不会直接干扰两个已经存在的部分中的任何一个。虽然我不详细了解redis,但似乎是个不错的选择。
【解决方案2】:

我想不出实现这一目标的直接方法。但我认为你可以在双方都使用socket-io 并通过它进行通信。

编辑:

正如 S.Pellegrino 所指出的,根据 op 的需求,从问题中所谓的“大型 Python 程序”构建 REST API 可能是一个不错的选择。

【讨论】:

  • 如果它不必是实时的,你可以只公开一个 REST API 来访问你的 python 程序的内部状态(直接从你的 python 脚本内部),然后从你的 js 中查询它。
  • @S.Pellegrino 是的,您指出这一点很好。根据 op 的需求,在他所谓的“大型 Python 程序”之上构建一个 rest api 也可能是一个很好的解决方案。
【解决方案3】:

您可以在 URL 中传递变量。

使用 JavaScript,您可以提取 URL 参数。例如,请参阅此回复:https://stackoverflow.com/a/50769370/2223027

【讨论】:

  • 据我们所知,没有网址。如果有,我认为解析请求不是一个好的选择,除非端点本身有意义,但是从端点获取数据不是操作所要求的。我认为您的回答没有解决问题。
  • @89f3a1c 页面有document.location,为什么说没有网址?根据“Is there a way to store this Python variable in memory (or some other way) that can be used by the Javascript code?”,看起来该值可能不会经常更改,因此将其作为 URL 传递可能是选项。如果不是,我同意 Redis 方法更有意义。
猜你喜欢
  • 2021-11-26
  • 2020-02-20
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
相关资源
最近更新 更多