2010-08-01 2 views
3

Я разрабатываю под Pylons, используя шаблоны Mako. Проблема в том, что мне нужно назначить строку из некоторого атрибута tmpl_context переменной JavaScript в теле страницы. Дополнительная проблема заключается в том, что эта строка может быть довольно произвольной, т. Е. Может содержать такие символы, как «,», <,> и т. Д. Существует ли общий способ выполнения такого задания? Я пробовал что-то вроде:Как получить некоторые строковые значения из контроллера Pylons, которые будут назначены переменным JavaScript с помощью Mako?

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

, но я получаю кавычки и HTML специальные символы спасся но я не хотел бы, чтобы отключить фильтрацию из-за возможной опасности выполнения неожиданного кода

ответ

2

У вас есть какие-то произвольные данные в c.my_string, и поэтому не хотят использовать "| п", не так ли?

Quickiest способ избежать его в JS стиле побега будет

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

Однако я не уверен насчет <> символов (с чем-то вроде </script> вставленной), может быть, вы также хотите использовать .replace('<', '&lt;');

Для юникода вам нужно также удалить символ «u» от начала строки.

+0

Правильно, это похоже на то, что мне нужно. Я думаю, что проблема лучше решить с помощью .replace ('<', '\ u003c'), потому что .replace ('<', '<') изменяет исходную строку. – eigenein

1

, если я понял, что вы хотите, попробуйте webhelpers.html.literal:

вспомогательный:

from webhelpers.html import literal 

HTML:

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

это лучше, чем ${c.mystring|n} спасаясь HTML

+0

Не совсем так. Целью присваивается значение переменной c.my_string переменной JS без изменений. Например, если c.my_string является foo <> _ "'" bar, то я хочу, чтобы какая-то переменная 'a' содержала ровно foo <> _"' "bar. – eigenein

+2

AFAIK literal() не избегает кавычек и не фильтрует html. То же самое, что и \ n - он сообщает escape(), что его содержимое уже экранировано. –

Смежные вопросы