传递给 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()}}
的实际值。我建议使用一个基本模板,然后可以由您的其他页面继承。
我正在尝试通过将一些常用 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()}}
的实际值。我建议使用一个基本模板,然后可以由您的其他页面继承。