GAE + Javascript推送:多线推送

时间:2011-01-06 13:38:53

标签: python google-app-engine

我在Google App Engine python代码中有这个,

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>

我的问题是如何将多线推送到数组?

提前致谢。

2 个答案:

答案 0 :(得分: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对象获得所需的所有数据。

答案 1 :(得分: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>
祝你好运!