Литералы шаблонов JavaScript в шаблоне Mako

У меня есть файл Mako (который мой сервер Python преобразует в HTML), который содержит элемент script с литералом шаблона JavaScript ES6. Поскольку и Mako, и JS распознают ${..}, я вынужден написать ${'${..}'}, чтобы заставить шаблоны JS работать ${{..}} сродни f-строке, ничего не делает, и я не могу найти флаг |, который бы его избегал. Сказать

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

Это работает, но выглядит неуклюже, как то, что вы видели в Perl, до такой степени, что я часто возвращаюсь к конкатенации строк, что обычно является признаком того, что скрывается более элегантное решение. Есть ли один?


person Matteo Ferla    schedule 05.08.2019    source источник
comment
Самое близкое, что я нашел, это: stackoverflow.com/questions/28890953/   -  person Matteo Ferla    schedule 06.08.2019


Ответы (1)


Шаблонность можно отключить с помощью тегов <%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}'}, если они не смешиваются, то есть сначала передаются переменные Python в JS сразу, что и должно происходить*. Загвоздка в том, что %if и %for не будут работать в блоках %text, но они должны быть закодированы JS.

) Хорошо, в идеале обслуживаемая HTML-страница должна быть общей без основного кода JS извне в виде одного файла с пользовательскими данными, заполненными несколькими запросами ajax. Хотя всегда есть крайние случаи (например, огромные сериализуемые объекты Python, отличные от JSON, со сложным и ресурсоемким методом, который необходимо часто вызывать, но который нельзя запускать как серию запросов ajax, поскольку данные должны сначала инициализируется, но не может быть сохранен на стороне сервера и т. д.).

person Matteo Ferla    schedule 23.09.2019