JavaScript Mako 模板中的模板文字

JavaScript template literals in a Mako template

我有一个 Mako 文件(我的 Python 服务器将其转换为 HTML),其中包含一个带有 JavaScript ES6 模板文字的脚本元素。由于 Mako 和 JS 都识别 ${..},我被迫编写 ${'${..}'} 以使 JS 模板工作 —${{..}} 类似于 f-string 什么都不做,我找不到 | 将逃脱它的标志。 说

<script>
//This is just an example
let entry = {title: '${some_py_value}'} //Mako templating
$('body').append(`${'${entry.title}'}`); //JS templating
</script>

这可行,但看起来很笨拙,就像您在 Perl 中看到的那样,以至于我经常恢复到字符串连接——这通常表明存在更优雅的解决方案。有吗?

可以使用标签 <%text></%text> (ref) 关闭模板。介于两者之间的任何内容都将呈现为文本而不进行解析。

<script>
//This is just an example
let entry = {title: '${some_py_value}'} //Mako templating
<%text>
$('body').append(`${entry.title}`); //JS templating
</%text>
</script>

这比 ${'${jsVariable}'} 如果两者没有混合, 一个是先在 JS 中一次性传递 Python 变量,这是应该发生的事情*。问题是 %if%for 不会在 %text 块中工作,但那些应该是 JS 编码的。

∗) 好的,理想情况下,所提供的 HTML 页面应该是通用的,没有外部的主要 JS 代码作为单个文件,用户数据由多个 ajax 请求填充。尽管总是存在极端情况(例如巨大的Python非JSON可序列化对象具有复杂且计算量大的方法,需要经常调用但不能运行 作为一系列 ajax 请求,因为数据需要先初始化但不能存储在服务器端等)。