2011-01-06 30 views
7

我在谷歌应用程序引擎Python代码都这样了,GAE +的Javascript推:多推

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)) 

,这在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> 

我的问题是,如何我推多行到数组??

在此先感谢。

+0

Multiline对Javascript有点棘手,用string_B中的'\'替换'\ n'应该可以工作。 – systempuntoout 2011-01-06 16:19:55

+0

只有替换\ n才能解决换行问题,但会留下其他字符(例如配额标记)和潜在的XSS漏洞。 – ehabkost 2011-01-12 12:35:53

回答

0

你使用的是什么样的模板库?我认为这是自动转义问题。如果你在GAE上使用Django tempalte,你应该这样尝试。

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

祝你好运!

1

如果您正在生成Javascript表达式,则需要小心转义该字符串,以便始终获得有效的Javascript表达式,并且不会引入XSS漏洞(以防字符串由用户提供)。您可以使用addslashes Django的模板过滤器,以逃避特殊字符的JavaScript字符串:

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

另一种解决方案是使用JSON来生成一个安全和正确转义包含你需要的所有数据JavaScript表达式Javascript代码。有关在GAE上使用json,请参见this question。使用JSON你可以写这样的:在模板

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

和:

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

这样,你得到你需要在一个阵列从ABC对象的所有数据。