2011-01-06 8 views
7

tengo esto en el código Python de Google App Engine,GAE + Javascript empuje: multilínea para empujar

class ABC(db.Model): 
    StringA = db.StringProperty() 
    StringB = db.StringProperty(multiline=True) 

abcs = ABC.all() 
template_values = {'abcs': abcs,} 
path = os.path.join(os.path.dirname(__file__), 'index.html') 
self.response.out.write(template.render(path, template_values)) 

y esto en el index.html,

<script type="text/javascript"> 
var string_A = []; 
var string_B = []; 

{% for abc in abcs %} 
string_A.push("{{ abc.StringA }}"); 
string_B.push("{{ abc.StringB }}"); //This doesn't work? 
{% endfor %} 
</script> 

Mi pregunta es que cómo Empujo la multilínea a la matriz?

Gracias de antemano.

+0

Multiline es un poco complicado en Javascript, reemplazar '\ n' con '\' en string_B debería funcionar. – systempuntoout

+0

Solo reemplazar \ n resolvería el problema de las nuevas líneas, pero dejaría otros caracteres (por ejemplo, marcas de comillas) y una posible vulnerabilidad XSS. – ehabkost

Respuesta

0

¿Qué tipo de biblioteca de plantillas está utilizando? Creo que es un problema de escape automático. Debería intentarlo así si usa Django tempalte en GAE.

<script type="text/javascript"> 
var string_A = []; 
var string_B = []; 

{% for abc in abcs %} 
string_A.push("{{ abc.StringA }}"); 
{%autoescape off} 
string_B.push("{{ abc.StringB }}"); 
{%endautoescape%} 
{% endfor %} 
</script> 

¡Buena suerte!

+0

No creo que sea un problema de autoescaneo, sino una cuestión de * no * que escapa correctamente de los valores. – ehabkost

1

Si está generando una expresión de Javascript, debe tener cuidado de escapar de la cadena para que siempre obtenga una expresión de Javascript válida y no introduzca una vulnerabilidad XSS (en caso de que los usuarios proporcionen las cadenas). Se puede utilizar el filtro de plantilla addslashes Django para escapar caracteres especiales de una cadena Javascript:

string_B.push("{{ abc.StringB|addslashes }}"); 

Una solución alternativa es utilizar JSON para generar una segura y adecuada escapó Javascript expresión que contiene todos los datos que necesita en el Código Javascript Ver this question sobre el uso de json en GAE. El uso de JSON se puede escribir algo como:

from django.utils import simplejson as json 
class ABC(db.Model): 
    # [...] 
    def as_json(self): 
     return json.dumps({'StringA':self.StringA, 'StringB':self.StringB}) 

Y en la plantilla:

<script type="text/javascript"> 
var abcs = []; 
{% for abc in abcs %} 
abcs.push({{ abc.as_json }}); 
{% endfor %} 
</script> 

esta manera se obtiene todos los datos que necesita de los objetos ABC en una sola matriz.