有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?

Posted

技术标签:

【中文标题】有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?【英文标题】:Is there a way to pass a Python variable to Javascript without writing it to a file? 【发布时间】: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... 我同意某些上下文可能有助于更好地解决问题。 不,我对这两个框架都不熟悉。也许是时候学习了。 【参考方案1】:

几个想法:

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

这是一个更好的主意:

    在您的 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://***.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 方法更有意义。

以上是关于有没有办法将 Python 变量传递给 Javascript 而无需将其写入文件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将变量传递给 Jinja2 父母?

有没有办法将变量传递给 Django 中的“扩展”模板?

有没有办法将变量传递给 Django 中的通用视图?

有没有办法将变量传递给 django 模板中的 <div> id?

Python 请求 - 动态传递 HTTP 动词

有没有办法将变量从 ReactJS 传递到 CSS 样式表?