7 Stimmen

GAE + Javascript push : mehrzeilig zu schieben

Ich habe dies in der Google App Engine Python-Code,

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

und dies in der 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>

Meine Frage ist, wie ich die Multiline in das Array schieben kann?

Vielen Dank im Voraus.

0 Stimmen

Mehrzeilig ist bei Javascript etwas knifflig, das Ersetzen von ' \n ' mit '\' in string_B sollte funktionieren.

0 Stimmen

Nur Ersetzen \n würde das Problem für Zeilenumbrüche lösen, aber andere Zeichen (z. B. Anführungszeichen) und eine potenzielle XSS-Schwachstelle bleiben bestehen.

1voto

ehabkost Punkte 411

Wenn Sie einen Javascript-Ausdruck generieren, müssen Sie darauf achten, die Zeichenkette zu entschlüsseln, damit Sie immer einen gültigen Javascript-Ausdruck erhalten und keine XSS-Schwachstelle einführen (falls die Zeichenketten von den Benutzern eingegeben werden). Sie können die addslashes Django-Template-Filter, um spezielle Zeichen für einen Javascript-String zu entschlüsseln:

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

Eine alternative Lösung besteht darin, json zu verwenden, um einen sicheren und korrekt escapeten Javascript-Ausdruck zu erzeugen, der alle Daten enthält, die Sie im Javascript-Code benötigen. Siehe diese Frage über die Verwendung von json auf GAE. Mit json können Sie etwas schreiben wie:

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

Und bei der Vorlage:

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

Auf diese Weise erhalten Sie alle Daten, die Sie von den abc-Objekten benötigen, in einem einzigen Array.

0voto

Nyambaa Punkte 34911

Welche Art von Templating-Bibliothek verwenden Sie? Ich denke, das ist Auto-Escaping Problem. Sie sollten versuchen, wie diese, wenn Sie ein mit Django tempalte auf 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>

Viel Glück!

0 Stimmen

Ich glaube nicht, dass es sich um ein Problem mit dem automatischen Ausschneiden handelt, sondern um ein Problem der nicht die Werte ordnungsgemäß zu escapen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X