Преобразование \ n в <br>в файлах мако - PullRequest
4 голосов
/ 18 февраля 2010

Я использую Python с пилонами

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

Это лучший способ сделать это?

> ${c.info['about_me'].replace("\n", "<br />") | n}

Ответы [ 6 ]

5 голосов
/ 27 сентября 2012

Проблема с вашим решением состоит в том, что вы пропускаете экранирование строки, что может привести к проблемам с безопасностью. Вот мое решение:

<%! import markupsafe %>
${text.replace('\n', markupsafe.Markup('<br />'))}

или, если вы хотите использовать его более одного раза:

<%!
    import markupsafe
    def br(text):
        return text.replace('\n', markupsafe.Markup('<br />'))
%>
${text | br }

В этом решении используется markupsafe, который используется mako, чтобы пометить безопасные строки и узнать, какие экранировать. Мы помечаем <br/> как безопасную, а не остальную часть строки, поэтому она будет экранирована при необходимости.

2 голосов
/ 18 февраля 2010

Остерегайтесь, поскольку разрывы строк в <textarea> s должны быть представлены как \r\n в соответствии с http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4

На всякий случай попробуйте s.replace('\r\n', '<br />'), затем s.replace('\n', '<br />').

2 голосов
/ 18 февраля 2010

Мне кажется, что это идеально подходит.

Имейте в виду, что replace() возвращает копию исходной строки и не изменяет ее на месте.Так как эта замена предназначена только для отображения, она должна работать нормально.

Вот небольшой визуальный пример:

>>> s = """This is my paragraph.
... 
... I like paragraphs.
... """
>>> print s.replace('\n', '<br />')
This is my paragraph.<br /><br />I like paragraphs.<br />
>>> print s
This is my paragraph.

I like paragraphs.

Исходная строка остается неизменнойИтак ... Это лучший способ сделать это?

Спросите себя: это работает?Сделал ли он работу быстро, не прибегая к ужасным взломам?Тогда да, это лучший способ.

1 голос
/ 09 января 2014

попробуйте это будет работать: -

${c.info['about_me'] | n}
1 голос
/ 12 сентября 2011

Это кажется мне опасным, потому что печатает всю строку без экранирования, что позволяет отображать произвольные теги. Убедитесь, что вы очистили ввод пользователя с помощью lxml или аналогичного перед печатью. Остерегайтесь того, что lxml будет заключен в HTML-тег, он просто не может обрабатывать вещи, которые не похожи на это, поэтому будьте готовы удалить это вручную или отрегулировать свой CSS для соответствия.

0 голосов
/ 17 октября 2012

Существует также простая справочная функция, которая может вызываться для правильного форматирования и санации текста, заменяя \ n для
тегов (см. http://sluggo.scrapping.cc/python/WebHelpers/modules/html/converters.html).

В helpers.py добавить следующее:

from webhelpers.html.converters import textilize

Тогда в вашем файле мако просто скажите

h.textilize( c.info['about_me'], santize=True)

Santize = True просто означает, что он гарантирует, что любые другие вредоносные коды будут экранированы, чтобы пользователи не могли взломать ваш сайт, поскольку по умолчанию установлено значение False. В качестве альтернативы я делаю сделать простую функцию-обертку в помощниках, так что santize = True всегда по умолчанию равно True, т.е.

from webhelpers.html.converters import textilize as unsafe_textilize

def textilize( value, santize=True):
    return unsafe_textilize( value, santize )

Таким образом, вы можете просто вызвать h.textilize (c.info ['about_me']) из вашего файла mako, который, если вы работаете со многими дизайнерами, не дает им сойти с ума.

...