如何将JavaScript的值设置为Jinja变量

13
我知道我们可以像这样将Jinja变量设置为js变量。
var x = {{ 'value' }}

但是我正在尝试相反的操作,即将 JavaScript 值设置为 Jinja 变量。我尝试了以下方法,但没有任何作用。

但我正在尝试相反的操作。即:将 JavaScript 的值设置到 Jinja 的变量中。我尝试了以下操作,但都没有生效。

{{value}} = x
{% set value = x %}
{% set value %} x {% endset %}

x是 JavaScript 变量。

有没有办法实现这个?

4个回答

21

这是不可能的,反映了你对Web应用程序架构理解上存在深层次的问题。Jinja2是一个Python模板引擎,运行在你的服务器上。你所说的JavaScript是在你的浏览器中运行。

当服务器接收到请求时,它会处理一个Jinja2模板以获取响应并发送给客户端。你无法“将Jinja变量设置为js变量”,但可以通过渲染页面的方式最终将Jinja2变量赋值给JavaScript变量。例如:你在Jinja2模板中开始使用var x = {{ value }};在Jinja2渲染过程中,jinja2将其转换为var x = 42;然后,渲染结果会发送到客户端,客户端作为JavaScript执行,将值42分配给x。由于存在时间序列(Python-> jinja2-> 渲染的页面源代码-> JavaScript),这意味着你不能做你想做的事情:Jinja2变量和JavaScript变量不同时存在,也不在同一位置,因此无法将JavaScript值分配给Jinja2变量。

为了将值42发送给Python(可能还需要发送给jinja2),需要发出请求,将该值从客户端发送到服务器:表单提交或AJAX请求等。

如果你能描述清楚具体想要做的事情,并且认为需要“将JavaScript值设置为Jinja变量”,你可能会得到更好的回答。


3
这是一个旧的帖子,答案可能仍然是“无法实现”,但我想指出两个上面的答案中的错误。问题是“如何将Javascript值设置为jinja变量”。他想知道的是,如果您在前端页面上运行需要特定值才能工作的JavaScript,并且该值由后端脚本提供并通过Jinja2传递,您是否可以使其工作?(也许是AJAX).. 上面的两个“答案”虽然详细和有用,但都没有回答这个问题。它们似乎都回答了相反的问题,“您是否可以从javascript设置jinja2变量”,我同意这没有意义。 我正在寻找相同问题的答案(如何将Javascript值设置为jinja变量),因为{{link1:这个教程}}关于flask与图表,向您展示将jinja变量插入到java脚本中。问题是Java将双括号({{VAR1}})视为脚本的一部分并抛出错误。

2
您所描述的方式是无法实现的。
让我们回顾一下Python、Jinja2和JavaScript,因为我认为我们仍然可以实现您想要的功能。Python是服务器端的语言,它将创建发送给客户端的HTML页面。Jinja2是Python的模板引擎,可以轻松生成HTML而不必直接编写HTML代码。请注意,在后端中调用像render_template()这样的函数。这将使用Jinja2语法生成HTML,将Jinja2语句替换为服务器已知的值,并在呈现给客户端之前将它们插入到HTML中。可以将Jinja2视为变量插入和简单脚本,用于生成HTML。JavaScript是您的前端脚本语言,在HTML生成并服务于客户端浏览器后运行。
您无法使用JavaScript“设置Jinja2变量”,因为在向客户端发送渲染后的HTML页面时,其中没有Jinja2变量。Python和Jinja2在向客户端浏览器发送纯HTML/CSS/JS页面之前在服务器上执行了该替换操作。
也许您想做的是使用前端元素来更改最初由Python和Jinja2在后端设置的值。为此,您需要让JavaScript将信息发送回服务器,以便服务器可以使用此信息重新呈现页面,并可能在过程中使用Jinja2插入新的值到您的模板中。考虑简单地链接到带有您想要设置的参数的URL。
例如,您可以链接到www.yourwebsite.com?x=value,现在后端中的x将被设置为'value'。您可以在HTML模板中使用它,包括{{ x }},当您调用render_template()时,它将解析为'value'。

1

好的...你可以从你的javascript向服务器发送一个post请求,然后从你的python后端将信息发送到html前端

javascript前端 > POST > python后端 > 模板 > html前端


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接