2010-08-01 35 views
3

Je développe sous Pylons en utilisant des modèles Mako. Le problème est que j'ai besoin d'affecter une chaîne d'un attribut de tmpl_context à une variable JavaScript dans un corps de page. Le problème supplémentaire est que cette chaîne peut être assez arbitraire, c.-à-d. Peut contenir des caractères tels que ",", <,>, etc ... Y at-il un moyen commun de faire une telle assignation? J'ai essayé quelque chose comme:Comment puis-je obtenir des valeurs de chaîne à partir du contrôleur Pylons être affecté à des variables JavaScript avec Mako?

..
<script> 
    ... 
    var a = "${c.my_string}"; 
    ... 
</script> 

mais je reçois des guillemets et les caractères HTML spéciaux se sont échappés mais je ne voudrais pas désactiver le filtrage en raison du danger possible d'exécuter code inattendu

Répondre

2

Vous avez des données arbitraires dans c.my_string, et donc ne voulez pas utiliser "| n", non?

quickiest moyen d'y échapper à se échapper de style JS serait

var a = ${c.my_string.__repr__()|n}; # Note lack of "" around it! 

Cependant, je ne suis pas sûr de <> caractères (avec quelque chose comme </script> inséré), peut-être vous aussi utiliser .replace('<', '&lt;');

Pour unicode, vous devrez également enlever le caractère 'u' du début de la chaîne.

+0

Juste, cela semble être exactement ce dont j'ai besoin. Je pense que le problème est préférable de résoudre avec .replace ('<', '\ u003c') parce que .replace ('<', '') change la chaîne source. – eigenein

1

si je comprends bien ce que vous voulez, essayez webhelpers.html.literal:

assistant:

from webhelpers.html import literal 

html:

<script> 
    document.write('${h.literal(c.my_string)}'); 
</script> 

c'est mieux que ${c.mystring|n} échapper html

+0

Pas tout à fait ça. Le but est d'assigner la valeur de c.my_string à une variable JS inchangée. Par exemple, si c.my_string est foo <> _ "", alors je veux que la variable 'a' contienne exactement la barre foo <> _" '. – eigenein

+2

AFAIK littéral() n'échappe pas aux guillemets et ne filtre pas le html. Donc c'est la même chose que | n - ça dit à escape() que son contenu est déjà échappé. –