Estoy tratando de insertar plantillas jQuery en plantillas Jinja2 . Por desgracia, ambos (en la configuración predeterminada) usan los bigotes {{ & }} para indicar expresiones y literales, respectivamente.
Estoy insertando mis plantillas jQuery en HTML con etiquetas de script , como esta:
<script type='text/x-jquery-template'> <div>The people are: {{ each people }} ${$value} {{ /each }} </div> </script> Sin embargo, si lo anterior está en una plantilla de Jinja, se resiste porque Jinja intenta interpretar each como un literal.
Dadas las circunstancias (ya tenemos muchas plantillas), no es práctico cambiar los delimitadores de inicio y final de Jinja2 para las variables. Además, es confuso, disminuye la interoperabilidad y requiere capacitación adicional. Es preferible evitar esta opción.
Entonces, las dos cosas alternativas que he pensado para resolver esto son:
Jinja2 escapando de cada '{{' y '}}', que no estoy muy seguro de cómo hacerlo mejor ("{{ "{{" }}`, tal vez, pero eso es detallado);
Más práctico, quizás ideal, sería decirle a Jinja2 que no analice un bloque de código, quizás a través de una extensión jQuery.
Estaría agradecido por pensamientos y comentarios. Gracias por leer.
Puede usar la construcción {% raw %}{% endraw %} para aliviar sus problemas de escape (directamente de los documentos de Jinja2 ).
Ejemplo:
<script type='text/x-jquery-template'> <div>The people are: {% raw %}<!-- Everything in here will be left untouched by Jinja2 --> {{ each people }} ${$value} {{ /each }} {% endraw %} </div> </script>Encontré esto a través de Google mientras experimentaba con polímero, pero no me gustó la solución propuesta, así que otra alternativa: usar filtros.
En su código python, defina un filtro:
#Filter to create curly braces @app.template_filter('curly') def curly(value): #Handle value as string {{'foo'|curly}} if(isinstance(value,str)): return_value = value #Handle value directly. {{foo|curly}} else: return_value = value._undefined_name return "{{" + return_value + "}}" Luego, en su plantilla puede usar {{'foo'|curly}} o {{foo|curly}}
PD: si no usa el matraz, creo que no puede usar el decorador, pero debe registrar el filtro explícitamente en su lugar: environment.filters['curly'] = curly .