Python的轻量级标记语言

4

我正在编写一个Python Web应用程序,我想创建一个文本区域,使用户可以使用一种轻量级标记语言输入文本。该文本将被导入到HTML模板中并在页面上显示。今天,我使用以下命令创建文本区域,它允许用户输入任何(HTML)文本:

my_text = cgidata.getvalue('my_text', 'default_text')
ftable.AddRow([Label(_('Enter your text')),
               TextArea('my_text', my_text, rows=8, cols=60).Format()])

我该如何更改代码,以允许仅使用一些(安全的,最终轻量级的)标记?欢迎所有建议,包括清理器,只要它可以轻松地与Python集成。

3个回答

8
使用Python的Markdown实现。
import markdown
mode = "remove" # or "replace" or "escape"
md = markdown.Markdown(safe_mode=mode)
html = md.convert(text)

它非常灵活,您可以使用各种扩展,创建自己的扩展等。


我尝试使用iPython,将文本定义为包含脚本标记的一些HTML。我得到了一个奇怪的输出:文本仍然是相同的,而html =“ [HTML_REMOVED]”。我需要做什么才能删除这些危险标签?我已经尝试了所有三种模式,但结果都是相同的。 - Anna SdG
运行了几个测试后,我意识到我不能输入任何HTML标签,只能使用Markdown语法,并且在这样做时我得到了安全的输出。谢谢,它起作用了! - Anna SdG
从文档中: 要替换HTML,请设置safe_mode="replace"(safe_mode=True仍然适用于向后兼容旧版本)。 HTML将被替换为markdown.HTML_REMOVED_TEXT中定义的文本,默认为[HTML_REMOVED]。 要使用其他内容替换HTML: markdown.HTML_REMOVED_TEXT =“-禁止使用原始HTML-” - molicule

2
您可以使用重构文本。我不确定它是否有清理选项,但它得到了Python的很好支持,并且它可以生成各种格式。

1

这个简单的清理函数使用白名单,与python-html-sanitizer-scrubber-filter的解决方案大致相同,但也允许限制属性的使用(因为您可能不希望有人使用style等属性):

from BeautifulSoup import BeautifulSoup

def sanitize_html(value):
    valid_tags = 'p i b strong a pre br'.split()
    valid_attrs = 'href src'.split()
    soup = BeautifulSoup(value)
    for tag in soup.findAll(True):
        if tag.name not in valid_tags:
            tag.hidden = True
        tag.attrs = [(attr, val) for attr, val in tag.attrs if attr in valid_attrs]
    return soup.renderContents().decode('utf8').replace('javascript:', '')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接