如何将javascript变量传递给jinja2模板中的宏

时间:2015-09-04 05:12:21

标签: javascript python jinja2

<script>
       function myFunction() {
                var name = "some_string";
                var display = "{{ python_function(name) }}";
                alert(display);
       }
</script>

以上Javascript是在jinja2模板中编写的。它应该将javascript变量(即var name)值传递给宏中的python函数。我知道上面的代码不能解决我的目的,因为我没有正确地将javascript变量值传递给宏。有人在jinja2模板中有将javascript变量传递给宏的方法吗?

1 个答案:

答案 0 :(得分:2)

您无法将值从javascript传递到模板,因为模板将在响应返回浏览器之前呈现,以便javascript引擎进行评估。模板渲染器能够解析javascript代码中指定的name值的唯一方法是解释<script></script>中嵌入的字符串。

<强>更新即可。让我们来看你的第二次尝试,你说的那次尝试。你有:

<body>
    <button onclick="js_fn('{{ py_fn('some_string') }}')">Click me</button>
    <script>
        function js_fn(variable) {
            alert(variable);
        }
    </script>
</body>

据推测,这有些偏见(例如 _index.html )。范围py_fn的视图,加载 _index.html ,评估字符串“py_fn('some_string')”,并将{{ py_fn('some_string') }}替换为该评估的结果。假设py_fn是字符串上的标识函数:它是一个一元函数,它接受一个字符串并立即返回它。然后,评估“py_fn('some_string')”的结果将是字符串'some_string',它将被替换回来,获得最终的,所谓的“渲染”模板:

<body>
    <button onclick="js_fn('some_string')">Click me</button>
    <script>
        function js_fn(variable) {
            alert(variable);
        }
    </script>
</body>

此字符串将成为请求响应主体的一部分,因此浏览器将转储窗口上的按钮,评估脚本块内的js代码,这将在{上创建全局变量js_fn {1}},它会采取一些措施并提醒它。单击该按钮,将始终使用常量window调用js_fn。如您所见,JS中没有值传递给Python / Flask。