【问题标题】:Is there a way to nest Flask variables (url_for) when passing to an HTML template? (Python)传递给 HTML 模板时,有没有办法嵌套 Flask 变量(url_for)? (Python)
【发布时间】:2020-09-13 18:30:57
【问题描述】:

我正在尝试通过将一些常见的 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 语句的脚本标签运行不正常。检查后显示为&lt;script src="{{url_for('static', filename='javascript/myjs.js')}}"&gt;&lt;/script&gt;。脚本文件位于正确的目录/文件路径中。

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

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

【问题讨论】:

  • 这是正确的方法,但也有浏览器缓存。你清除了吗?
  • 另外,你为什么要在每个请求上传递导航栏?我为什么要传递导航栏 导入 没有意义
  • |safe 与 jinja 是否会识别双括号有什么关系吗?
  • @roganjosh 我没有尝试清除浏览器缓存,但我一直在更改之间进行硬重新加载。清算会做什么?
  • 为什么没有基础模板并使用模板继承?这不是每个请求都要传递的东西

标签: python html flask jinja2 url-for


【解决方案1】:

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

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

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

【讨论】:

  • 这似乎也是其他一些 cmets 的共识。我会将事情切换到基本模板。那么这样就没有办法了?
  • @JoshLowy 拥有模板继承是更好的做法,但我敢肯定,如果您迫切需要,您可以找到一种使其工作的方法。例如,不用在common 字典中放置url_for() 周围的双括号,您可以只连接url 的实际值。像这样:"scripts":"&lt;script src="+url_for('static', filename='my.js')+"&gt;&lt;/script&gt;
  • 那个坏了,你不能放弃{{}}
  • 忽略我。我忘了他们正在传递一个字符串,该字符串在 jinja 格式上加倍。对不起
  • @roganjosh 别担心,这是一种奇怪的方式,所以难怪它会让人困惑。我真的认为模板继承会好很多,主要是因为它更简单。
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 2023-01-11
  • 2021-05-12
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多