2011-01-06 25 views
7

mam to w kodzie Pythona Google App EngineGAE + Javascript Push: multiline naciskać

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

i to w 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> 

Moje pytanie jest, że jak Popycham multiline do tablicy?

Z góry dziękuję.

+0

Multiline jest nieco skomplikowany w JavaScript, zastępując "\ n" przez "\" w string_B powinno działać. – systempuntoout

+0

Tylko zamiana \ n rozwiązuje problem nowych linii, ale pozostawia inne znaki (na przykład znaki quotaion) i potencjalną lukę XSS. – ehabkost

Odpowiedz

0

Jakiego rodzaju biblioteki szablonów używasz? Myślę, że to kwestia automatycznego ucieczki. Powinieneś tego spróbować, jeśli używasz Django tempalte na 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> 

Powodzenia!

+0

Nie sądzę, że jest to problem z autoescaping, ale kwestia * nie * poprawnie wymyka się wartościom. – ehabkost

1

Jeśli generujesz wyrażenie JavaScript, musisz być ostrożny, aby uciec przed ciągiem znaków, aby zawsze uzyskać prawidłowe wyrażenie JavaScript i nie wprowadzać luki XSS (w przypadku, gdy łańcuchy są dostarczane przez użytkowników). Można użyć addslashes Django filtr szablon do ucieczki specjalne znaki na sznurku javascript:

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

Alternatywnym rozwiązaniem jest użycie JSON wygenerować bezpieczne i właściwie uciekł javascript wyrażenie zawierające wszystkie dane będą potrzebne w Kod JavaScript. Zobacz: this question o używaniu json na GAE. Korzystanie json można napisać coś takiego:

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

A na szablonie:

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

W ten sposób można uzyskać wszystkie dane będzie trzeba z obiektów ABC w pojedynczej macierzy.