我想知道我是否可以通过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)
,它以以下方式进行处理:
- Flask服务器打开main.html模板
- 渲染/替换所有定义的Jinja变量,即模板中的上下文
- 将呈现的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>
这将允许您的脚本正确执行。