【问题标题】:How to pass JavaScript variable to function in Jinja tag如何将 JavaScript 变量传递给 Jinja 标记中的函数
【发布时间】:2015-09-04 05:12:20
【问题描述】:
<script>
       function myFunction() {
                var name = "some_string";
                var display = "{{ python_function(name) }}";
                alert(display);
       }
</script>

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

【问题讨论】:

    标签: javascript python jinja2


    【解决方案1】:

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

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

    <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代码,这将在window上创建一个全局变量js_fn ,这将采取一些措施并提醒它。单击该按钮时,将始终使用常量some_string 调用js_fn。如您所见,没有将值从 JS 传递到 Python/Flask。

    【讨论】:

    • 你的意思是我可以像&lt;script&gt; var some_var = "{{ python_function(&lt;script&gt;name&lt;/script&gt;) }}"; &lt;/script&gt;一样改变它吗?
    • @Rohanil 那也行不通。让我们想想那会做什么。视图(或类似的东西)获取该字符串,将 python_function(&lt;script&gt;name&lt;/script&gt;) 的内容替换为该特定参数的 python_function 的返回值。不用说,&lt;script&gt;name&lt;/script&gt; 不会解析为 python 中的任何值,所以你会在屏幕上看到一些错误,比如“”无法识别。
    • 是的,你是对的。它肯定不会起作用。所以似乎不可能通过 jinja2 宏将 js 变量传递给 python 函数。在特定情况下您有任何解决方法吗?
    • @Rohanil 哦,您可以做的一件事是:(1)在服务器端设置一个 ajax 端点,(2)向路由器添加一个特殊的内部 url 以在当一些东西被发布到它上面,(3) 对该 url 进行 ajax 调用,并像你在那里那样提醒来自 ajax 调用的响应。
    • 谢谢,您的解决方案应该有效。但我在烧瓶应用程序中使用 jinja2 模板。所以我有特权可以在不使用 ajax 的情况下从模板调用 python 函数。我将一些值从 HTML 传递给 javascript 变量,然后我将该 JS 变量用作 python 函数的参数,如上面的代码所示。但后来我将代码结构更改为&lt;body&gt; &lt;button onclick="myFunction('{{ python_function('some_string') }}')"&gt;Click me&lt;/button&gt; &lt;script&gt; function myFunction(variable) { alert(variable); }&lt;/script&gt;&lt;/body&gt;,它起作用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多