2012-06-22 3 views
2

Я использую шаблоны Мако для создания веб-страницы.Pyramid - mako: Escape HTML частично

Существует раздел, в котором я предотвращаю утечку html с использованием | п. Тем не менее, внутри, мне также нужно показать некоторые созданные пользователем записи, для которых мне нужно избегать HTML на стороне приложения.

Каким образом можно пойти с пирамидой для этого?

Я знаю, что есть CGI, но он не кажется таким же хорошим, как у Мако, и я хотел бы использовать его.

В настоящее время у меня есть:

from pyramid.compat import escape 

escape(str) 

Спасибо!

ответ

3

Согласно pyramid docs, pyramid.compat.escape предоставляет cgi.escape (html.escape на Python 3).

В соответствии с mako docs функциональность эвакуации предоставляется markupsafe.escape(x). Следует иметь в виду, что может быть полезно, что MarkupSafe будет искать метод __html__ для объекта, который он экранирует, и если он его найдет, он вызовет этот метод и будет использовать результаты в качестве экранированной строки. Это может позволить вам некоторую гибкость в том, как некоторые элементы экранируются.

Вы можете либо использовать один из них, либо другой вариант (если возможно) изменить шаблон, чтобы на самом деле экранирование действительно происходило в шаблоне, а не в представлении.

2

Пакет webhelpers предлагает функцию эвакуации, которая может помочь. Из docs:

webhelpers.html.builder

HTML Builder обеспечивает:

HTML-объект, который создает (X) HTML-теги в виде вещий образом.

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

умный побег(), который сохраняет литералов, но избегает других строк, которые могут случайно содержать символы разметки («<», «>», «&»,»», «»») или вредоносные теги Javascript. Снятые строки возвращаются как литералы, чтобы предотвратить их двойное сбежание позже.

2

Я думал, что брошу свои 2 цента здесь, так как я искал решение аналогичной проблемы. В моем случае я очень новичок в Python и Pyramid, и я модифицирую Single File Tasks Tutorial, чтобы создать (очень) простой блог.

Мой почтовый контент был сохранен как строка в базе данных sqlite. Проблема заключалась в том, что когда строка содержимого выводилась в шаблон, теги html отображались как обычный текст.

Таким образом, вместо:

enter image description here

я получаю:

enter image description here

| n Добавление фильтра решить мою проблему. HTML-контент теперь отображается правильно в моих почтовых телах.

Мой шаблон (.mako) для списка сообщений:

# -*- coding: utf-8 -*- 
<%inherit file="layout.mako"/> 

<ul id="posts"> 
% if posts: 
    % for post in reversed(posts): 
    <li> 
    <span class="name">${post['name']}</span> 
    <span class="content">${post['content'] | n}</span> 
    </li> 
    % endfor 
% else: 
    <li>Sorry, no posts...</li> 
% endif 
</ul> 

и view_config:

@view_config(route_name='list', renderer='list.mako') 
def list_view(request): 
    rs = request.db.execute("select id, name, content from posts") 
    posts = [dict(id=row[0], name=row[1], content=row[2]) for row in rs.fetchall()] 
    return {'posts': posts} 

This answer helped me out.

Я надеюсь, что это поможет кому-то.

0

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

Перед сохранением или отображением заказного пользовательского разметки, я очистить HTML с:

from html5lib import sanitizer 
from html5lib import html5parser, serializer, treebuilders, treewalkers 

# This sanitizer translates all the troublesome tokens 
def sanitize2(text): 
    if (text is None) or isinstance(text, (int, long)): 
     return text 
    sanobj      = sanitizer.HTMLSanitizer 
    sanobj.strip_tokens   = True 
    sanobj.lowercaseElementName = True 
    sanobj.lowercaseAttrName = True 
    hparser      = html5parser.HTMLParser(tree = treebuilders.getTreeBuilder('dom'), tokenizer=sanobj) 
    dommodel     = hparser.parse(text) 
    serobj      = serializer.htmlserializer.HTMLSerializer(sanitize = False) 
    outstr      = ''.join(serobj.serialize(treewalkers.getTreeWalker('dom')(dommodel))) 
    return outstr 

Тогда, у меня есть пользовательские пирамиды фильтр на самом деле его отображения:

import markdown 

def jmarkdown(text): 
    return markdown.markdown(text) 

Это делает " | jmarkdown "работать!

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