如何通过jinja[Flask]访问外部javascript文件



我想知道我是否可以通过jinja访问外部javascript文件?它可以很好地处理html文件或嵌入html文件中的js,但当javascript文件是外部文件时就不行了。

代码:

@app.route('/')
def default():
return render_template('main.html', var1 = 1, var2 = 2)

main.html代码:

<html>
<body>
<p>The first value is {{var1}}</p>
<script src="main.js"></script>
</body>
</html>

main.js文件:

window.onload=function(){
console.log('{{var2}}');
};

现在main.js中的jinja代码不起作用

也许不可能在外部js中使用它?

如果有人能帮忙,请回复这个帖子。

您需要了解Jinja是如何工作的。当你运行命令时return render_template('main.html', var1 = 1, var2 = 2),它以以下方式进行处理:

  1. Flask服务器打开main.html模板
  2. 渲染/替换所有定义的Jinja变量,即模板中的上下文
  3. 将呈现的HTML发送到客户端

因此,变量不会加载到客户端的{{ var }}占位符中,而是加载到服务器端。

因此,为了实现你想要做的事情,你可以做以下事情:在main.html代码中:

<html>
<body>
<p>The first value is {{var1}}</p>
<script>var var2 = {{var2}};
<script src="main.js"></script>
</body>
</html>

在main.js代码中:

window.onload=function(){
console.log(var2);
};

注意:在调用依赖脚本main.js之前,我们已经在HTML代码中添加了该脚本。

如果这解决了你的问题,并且你已经理解了解释,请告诉我。

TLDR;将flask变量传递给HTML文件中的全局JS变量

我认为不可能直接从Flask访问外部JavaScript文件。但是你可以使用这个破解,它可以与许多模板语言(Jinja,EJS…(一起使用

main.py:

@app.route('/')
def default():
return render_template('main.html', var1 = 1, var2 = 2)

main.html

<html>
<body>
<p>The first value is {{var1}}</p>
<!-- Insert this <script/> tag before loading you main.js -->
<script type="text/javascript"> window.myVar1 = "{{var1}}" </script>
<script src="main.js"></script>
</body>
</html>

main.js

window.onload=function(){
// Now you can access to myVar1 directly
console.log(myVar1);
};

上周,我遇到了同样的问题,我还认为无法导入外部JavaScript文件。然而,我现在找到了一个解决方案。

事实上,所有静态文件都应该放在;静态";文件夹这样,无论是图像、CSV文件还是JavaScript,您都可以访问它们。例如,如果您创建一个";js";文件夹中的";静态";文件夹并将您的脚本放在那里,您可以将其包含在HTML中,如下所示:

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

这将允许您的脚本正确执行。

最新更新