2011-01-06 4 views
7

をプッシュする複数行私はindex.htmlをで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)) 

これは、Google App Engineのパイソンのコードでこれを持って、

<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

JavascriptではMultilineがちょっと難しいですが、 '\ n'をstring_Bの '\'に置き換えるとうまくいくはずです。 – systempuntoout

+0

\ nを置き換えるだけで改行の問題は解決しますが、他の文字(クォーテーションマークなど)と潜在的なXSSの脆弱性が残ります。 – ehabkost

答えて

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> 

幸運!

+0

私はそれがオートエスケープ問題ではないと思っていますが、値を正しくエスケープしていない*という問題があります。 – ehabkost

1

Javascript式を生成している場合は、文字列をエスケープして、常に有効なJavascript式を取得し、XSSの脆弱性を導入しないようにする必要があります。あなたは、Javascriptの文字列の特殊文字をエスケープするaddslashes Djangoテンプレートフィルタを使用することができます。

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

代替ソリューションは、あなたが必要なすべてのデータを含むJavaScript式を逃れ、安全かつ適切に生成するためにJSONを使用することですJavascriptコード。 GAEでjsonを使用する方法については、this questionを参照してください。

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> 

あなたが1つのアレイ内のABCオブジェクトから必要なすべてのデータを取得し、この方法はJSONを使用すると、のようなものを書くことができます。