这是我有史以来第一个关于 SO 的问题,我很高兴提出任何改进建议。要温柔 :)
为了提高可维护性,我试图将 CSS、JS 和 HTML 放在同一个文件中。这对于包含文件或宏等变得很困难。最终输出template.render()
应该抓取所有 CSS 和 JS,并将其放置在基本 HTML 模板的顶部和底部。
示例应该解释我的意思:
base.html
<html>
<head>
<style>
{{ print_css() }}
</style>
</head>
<body>
{% include 'bolded_text.html' %}
<script>
{{ print_js() }}
</script>
</body>
</html>
加粗文本.html
{# this doesn't need to be a filter. It could be a block, or anything else that would make this work #}
{% filter add_css %}
strong {
background: #ccc;
}
{% endfilter %}
<strong>Bolded text</strong>
{% filter add_js %}
alert('javascript included!');
{% endfilter %}
输出当然是:
<html>
<head>
<style>
strong {
background: #ccc;
}
</style>
</head>
<body>
{% include 'bolded_text.html' %}
<script>
alert('javascript included!')
</script>
</body>
</html>
可以预见,问题是 print_css() 什么也不输出。
我尝试使用上下文过滤器执行此操作,在上下文中的位置add_js
和附加到变量,add_css
然后输出该变量。这对于 JavaScript 来说工作得很好而且很简单,因为 print 语句遵循所有的过滤器。print_css
print_js
但是,我想不出一种使它与 CSS 一起工作的方法。如果我可以使print_css()
调用变得懒惰,或者以某种方式在 jinja2 AST 中交换输出,那可能会起作用。我试图避免 hacky 字符串操作(例如在底部输出 CSS,然后使用正则表达式将其移动到顶部)。
我想可能有一种方法可以优雅地做到这一点,而我对 jinja2 的低级 API 的经验是有限的。
非常感谢任何帮助,谢谢!