传递给 HTML 模板时,有没有办法嵌套 Flask 变量 (url_for)? (Python)

Is there a way to nest Flask variables (url_for) when passing to an HTML template? (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>。脚本文件在正确的 directory/filepath.

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

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

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

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

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