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

Roh*_*nil 5 javascript python jinja2

<script>
       function myFunction() {
                var name = "some_string";
                var display = "{{ python_function(name) }}";
                alert(display);
       }
</script>
Run Code Online (Sandbox Code Playgroud)

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

Hun*_*yan 5

您不能以这种方式将值从 javascript 传递到模板,因为模板将在响应返回到浏览器以供 javascript 引擎评估之前呈现。模板渲染器能够解析namejavascript 代码中指定的值的唯一方法是解释嵌入在<script></script>.

更新。让我们看看你的第二次尝试,你说的那一次成功了。你有:

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

大概这是在某些部分(比如_index.html)。具有py_fn作用域的视图加载_index.html,评估字符串“py_fn('some_string')”,并替换{{ py_fn('some_string') }}为该评估的结果。假设py_fn是字符串上的恒等函数:它是一个接受字符串并立即返回它的一元函数。然后,评估 "py_fn('some_string')" 的结果将是 string 'some_string',它将被替换回来,获得最终的,所谓的“渲染”模板:

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

该字符串将成为请求响应正文的一部分,因此浏览器将转储窗口上的按钮,评估脚本块内的 js 代码,这将在 上创建一个全局变量js_fn,该变量window将接收某些内容并提醒它。单击该按钮时,将始终js_fn使用常量调用some_string。如您所见,没有将值从 JS 传递到 Python/Flask。

  • @Rohanil 哦,你可以做的一件事是:(1) 在服务器端设置一个 ajax 端点,(2) 向路由器添加一个特殊的内部 url,以便在向路由器发送某些内容时调用您的魔法函数,(3 ) 对该 url 进行 ajax 调用,并像您在那里所做的那样提醒来自 ajax 调用的响应。 (2认同)