【问题标题】:Pass parameter with Python Flask in external Javascript在外部 Javascript 中使用 Python Flask 传递参数
【发布时间】:2025-12-23 18:45:07
【问题描述】:

我在我的网站上使用 Python Flask,并将几个参数传递给 Javascript。这是我的代码:

from flask import Flask
from flask import render_template

app = Flask(__name__)


@app.route("/")
def index():

    return render_template("index.html", param1="Hello")


<html>
   <head>
   </head>
   <body>
      <p>Hello World</p>
   </body>
   <script>console.log({{param1}})</script>
</html>

通过这种方式,它可以毫无问题地工作。该示例是我自己的简化示例。但是,如果我想将脚本放在外部文件上并像这样调用它:

<html>
   <head>
   </head>
   <body>
      <p>Hello World</p>
   </body>
   <script src="/static/js/myjs.js"></script>
</html>

myjs.js 文件是console.log({{param1}}),那么它就不起作用了。那么,有没有什么办法可以用 Python Flask 在外部 Javascript 文件中传递参数呢?

【问题讨论】:

  • 脚本必须在模板目录中
  • 我有两个文件夹:1)静态和 2)模板。在静态文件夹中有 css、js 和图像。我应该移动 js 文件 ijn 模板以使其工作吗?

标签: javascript python flask


【解决方案1】:

我使用了另一种方式来加载在 html 页面中指定的 javascript 文件:

首先,我在 &lt;head&gt;&lt;/head&gt; 标签中定义了一些变量,所以我调用了我的 javascript 文件:

<head>
...
<script src="/static/js/jquery.js"></script>
<script  type=text/javascript>
    $(document).ready(function() {
        $link_subcat = "{{ url_for('load_subcategories') }}";
        $link_cat = "{{ url_for('load_categories') }}";
    });
</script>

<script src="{{ url_for('static', filename='finances.js') }}"></script>
...

这是我的 javascript 文件内容:

$(document).ready(function() {

    $("#category").change(function() {
        $.ajax({
            type: "POST",
            url: $link_subcat,
            data: {cat: $(this).val()},
            success: function(data) {
                $("#subcategory").html(data);
            }
        });
    });

    $("input[name=type]").change(function() {
        $.ajax({
            type: "POST",
            url: $link_cat,
            data: {type: $('input[name="type"]:checked').val()},
            success: function(data) {
                $("#category").html(data);
            }
        });
    });

});

这种方法对我有用。

【讨论】:

    【解决方案2】:

    如果你想用 Jinja 渲染一个文件,你需要在它上面调用render_template 并传递给它想要的值。只是直接链接到静态文件显然不会这样做。一种解决方案是使用 Jinja 的 include 块。这要求 'myjs.js' 位于 'templates/js' 文件夹中,并将其包含在呈现的模板中,将所有模板上下文传递给包含的模板。

    <script>{% include 'js/myjs.js' %}</script>
    

    更好的解决方案是不需要在每次请求时都渲染 js,而是将参数从模板传递给 js 函数。

    <script src="{{ url_for('static', filename='js/myjs.js') }}"></script>
    <script>
        my_func({{ my_var|tojson }});
    </script>
    

    【讨论】: