2009-12-21 7 views
1

J'essaie de rendre une chaîne en javascript (qui fonctionne généralement bien pour moi) voici mon codepython chaîne de django problème de rendu

HTML:

THE USER NAME IS : {{name}} has added app {{has_added_app}} 

JAVA SCRIPT:

<script> 
    <!-- 
     var userName = {{name}} 

La version html fonctionne javascript échoue lorsque j'ai essayé le même rendu en javascript avant et cela a fonctionné.

+0

Le fichier javascript est-il rendu via l'instance django ou un serveur Web (lighttpd)? –

Répondre

8
var userName = {{name}} 

SORT lorsque vous affichez la source HTML comme:

var userName = Bob 

Ce qui est une erreur évidente: citations manquantes. Mais, en mettant simplement des citations autour de lui:

var userName = '{{name}}'; 

n'est pas assez bon pour le cas général. Que faire si la chaîne contient un caractère de citation, une barre oblique inverse ou un saut de ligne? Dans le meilleur des cas, votre application tombe. Dans le pire des cas, trou de sécurité de cross-site-scripting. De plus, un caractère & ou < dans le nom ne s'affichera pas correctement non plus, car Django autoescape supposera probablement qu'il se trouve dans un contexte HTML non-CDATA et qu'il les ignorera.

Utilisez le filtre escapejs à la place:

var userName = '{{name|escapejs}}'; 

Vous pouvez également utiliser un encodeur JSON pour transformer tout type de données de base dans le format littéral JavaScript, pas seulement la chaîne. Il y a json dans la bibliothèque standard de 2.6, mais notez que cela n'échappe pas au caractère < dans les chaînes, donc pour injecter du code dans un élément de script, vous devez l'échapper manuellement pour empêcher une séquence </script> de terminer prématurément l'élément CDATA.

1

commentaires pour le javascript:

var userName = "{{name}}"; 
0

Rappelez-vous que les modèles de Django sont purement textuelle: ils ne « savent » que vous créez Javascript. Vous devez inclure les citations que Javascript a besoin autour d'une chaîne littérale:

var userName = "{{name}}"; 
+0

Il manque le filtre d'échappement –