我知道我们可以像这样将Jinja变量设置为js变量。
var x = {{ 'value' }}
但我正在尝试反过来。即我试图将javascript值设置为jinja变量。我尝试了以下但没有任何效果。
{{value}} = x
{% set value = x %}
{% set value %} x {% endset %}
x是javascript变量。
有没有办法实现这一目标。
答案 0 :(得分:7)
这是不可能的,并且反映了您对Web应用程序体系结构的理解中的深层次问题。 jinja2是Python的模板引擎,在您的服务器上运行。您正在谈论的JavaScript正在浏览器中运行。
当服务器收到请求时,它会处理jinja2模板以获取它将发送给客户端的响应。你不能“将Jinja变量设置为js变量”,你可以这样的方式渲染页面,最终为JavaScript变量分配一个Jinja2变量中的值。即你从jinja2模板中的var x = {{ value }}
开始; jinja2在渲染过程中将其转换为var x = 42
;然后将渲染结果发送到客户端,客户端将其作为JavaScript执行,将值42分配给x
。这里有一个时间序列的事实(Python - > jinja2 - >渲染页面源 - > JavaScript)意味着你不能做你想做的事:jinja2变量和JavaScript变量不存在于同时,也不是在同一个地方,并且将JavaScript值分配给jinja2变量是不可能的。
为了将值42
发送到Python(可能稍后发送到jinja2),您需要发出一个请求,将该值从客户端发送到服务器:表单提交或AJAX请求。
如果您准确描述您想要做的事情,您可能会得到更好的回应,您需要“将javascript值设置为jinja变量”。
答案 1 :(得分:1)
您所描述的方式无法完成。
让我们回顾一下Python,Jinja2和JavaScript,因为我认为我们仍然可以实现您想要的。
Python是服务器的语言,它将创建发送到客户端的HTML。
Jinja2是Python的模板引擎,可以轻松生成HTML,而无需直接编写HTML。请注意,您正在后端中调用类似render_template()
的函数。这将使用Jinja2语法生成HTML,将Jinja2语句替换为服务器已知的值,然后在将其呈现给客户端之前将其插入HTML。将Jinja2视为变量插入的简写,以及制作HTML的简单脚本。
JavaScript是您的前端脚本语言,一旦生成并提供HTML,便会在客户端的浏览器上运行。
之所以不能使用Javascript来“设置Jinja2变量”,是因为在发送给客户端的呈现HTML中没有Jinja2变量。在将纯HTML / CSS / JS页面发送到客户端的浏览器之前,Python和Jinja2在服务器上进行了替换。
也许您想做的是使用前端元素来更改最初由python和Jinja2在后端设置的值。为此,您需要使JavaScript将信息发送回服务器,以便服务器可以使用此信息来重新呈现页面,并可能在此过程中使用Jinja2将新值插入模板中。考虑简单地使用您要设置的参数链接到URL。
您可以链接到www.yourwebsite.com?x=value
,现在x
将在后端设置为'value'
。您可以通过包含{{ x }}
在HTML模板中使用它,当您调用render_template()
答案 2 :(得分:0)
这是一个旧线程,答案可能仍然是“无法完成”,但我想指出上述两个答案中的一个错误。问题是“如何将 javascript 值设置为 jinja 变量”。他要问的是,如果您的前端页面上运行的 JavaScript 需要某个值才能工作,并且该值由后端脚本提供并通过 Jinja2 传入,您能使其工作吗? (也许是 AJAX)。上面的两个“答案”虽然详细且内容丰富,但都没有解决这个问题。他们似乎都解决了相反的问题,“你能从 javascript 设置一个 jinja2 变量吗”,我同意这是没有意义的。 我正在寻找同一问题的答案(如何将 javascript 值设置为 jinja 变量),因为带有图表的烧瓶上的 This tutorial 显示您将 jinja 变量插入到 java 脚本中。问题是 Java 将双括号 ( {{ VAR1 }} ) 视为脚本的一部分并引发错误。