首页 > 解决方案 > 传递给 HTML 模板时,有没有办法嵌套 Flask 变量(url_for)?(Python)

问题描述

我正在尝试通过将一些常见的 HTML 元素作为 Flask 变量(特别是我的样式表和脚本)传递来模板化它们。为了进一步简化和响应,我试图用它们url_for来连接它们。

在我的 app.py 中,我有:

common_html = {
   'navbar': '''<nav class....>''',
   'scripts': '''<!-- D3 -->
        <script src="https://d3js.org/d3.v5.min.js"></script>
        <!-- Personal JS -->
        <script src="{{url_for('static', filename='javascript/myjs.js')}}"></script>'''
}

@app.route('/index')
def index():
   return render_template('index.html', common=common_html)

在我的 HTML 文件中:

...
<body>
   <!-- Nav --!>
   {{common['navbar']|safe}}
   <h1>Stuff</h1>
</body>
<!-- Scripts -->
{{common['scripts']|safe}}
</html>

在浏览器中,我的导航栏代码加载得很好,但是包含 url_for 语句的脚本标签运行不正常。<script src="{{url_for('static', filename='javascript/myjs.js')}}"></script>经检查显示为原样。脚本文件位于正确的目录/文件路径中。

我试过删除{{}}双括号并弄乱使用的不同引号无济于事。我记得这种方法以前在某个时候有效,但不能肯定地说。

是否有在模板代码块中使用 url_for 的做法或方法,或者这是不好的做法?任何和所有的帮助将不胜感激!

标签: pythonhtmlflaskjinja2url-for

解决方案


我认为这样做的原因是 jinja 不会已经渲染的东西中渲染任何东西。因此,因为您在{{ url_for() }}内部传递了一个双括号,它会自动转义其中的任何内容。您基本上所做的是将 Jinja 语法放入 Jinja 未评估的内容中。所以它实际上看起来像这样:

{{ "{{ url_for() }}" }}.

请记住,Jinja 只会将第一个双括号中的内容放在页面上(在转义之后),因此它不会呈现 that 的实际值{{url_for()}}。我建议使用一个基本模板,然后您的其他页面可以继承该模板。


推荐阅读