2011-02-25 17 views
26

Estoy tratando de insertar jQuery templates en las plantillas Jinja2. Desgraciadamente, ambos (en la configuración predeterminada) usan los bigotes {{ & }} para indicar expresiones y literales, respectivamente.Evitar los bigotes ambiguos de Jinja2 que incluyen plantillas jQuery

estoy insertando en mis plantillas jQuery HTML con etiquetas script, así:

<script type='text/x-jquery-template'> 
    <div>The people are: 
     {{ each people }} 
      ${$value} 
     {{ /each }} 
    </div> 
</script> 

Si lo anterior es una plantilla en Jinja, sin embargo, se resiste porque Jinja trata de interpretar each como un literal.

Dadas las circunstancias (ya tenemos muchas plantillas), no es práctico cambiar los delimitadores de inicio y fin de Jinja2 para las variables. Además, es confuso, disminuye la interoperabilidad y requiere entrenamiento adicional. Es preferible evitar esta opción.

Así las cosas dos alternativas He pensado para resolver este son:

  1. Jinja2 escapar cada uno '{{' y '}}', que no estoy muy seguro de cómo hacerlo mejor ("{{ "{{"}}`, tal vez, pero eso es detallado);

  2. Más práctica - tal vez ideales - habría diciendo Jinja2 a no analizar un bloque de código, tal vez a través de una extensión de jQuery.

Estaría agradecido por sus pensamientos y comentarios. Gracias por leer.

+3

¡Yo también tengo un bigote ambiguo! Me recuerda que es hora de afeitarse. :) –

Respuesta

51

Puede usar la construcción {% raw %}{% endraw %} para facilitar sus problemas de escape (directamente desde Jinja2 docs).

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> 
+4

Aunque escapar y bloquear bloques son agradables, llego a la conclusión de que la mejor manera es asegurarse de que los delimitadores del servidor sean exclusivos del servidor y los delimitadores del cliente sean exclusivos del cliente, por lo que no hay cero escapando requerido. Parece que esto se puede hacer configurando el motor de plantilla de servidor para usar sus propios delimitadores personalizados. Esto le da a uno la libertad de elegir plantillas del lado del servidor y del cliente sin tener que escapar es un problema. Nota adicionalmente, uno debe asegurarse de que AMBOS motores no entren en conflicto con JavaScript u otra codificación del lado del cliente. – iJames

+0

No sé si lo necesitaré, pero me gustaría tener la libertad de usar las características de Jinja2 dentro de mis plantillas de manubrios. Sin embargo, lo opuesto sería atractivo también, para poder usar el mismo idioma en el servidor y el cliente, así puedo renderizar una versión predeterminada en el servidor y luego usar las mismas plantillas para que el cliente la actualice. –

3

He encontrado que esto a través de Google mientras que la experimentación con polímero pero no como la solución propuesta, por lo que otra alternativa: Use filtros.

En su código Python definir 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 que puede utilizar {{'foo'|curly}} o {{foo|curly}}

PS: Si usted no usa frasco creo que no se puede utilizar el decorador pero tiene que registrar el filtro explícitamente en su lugar: environment.filters['curly'] = curly.

+0

He estado buscando varias soluciones a este problema esta tarde y la tuya es de lejos la más elegante, y tiene el gran beneficio de jugar bien con Jasmine y Karma para la Prueba Unitaria. ¡¡Gracias!! –

Cuestiones relacionadas