“安全”的Python HTML文本格式化(如textile)

3 投票
3 回答
2038 浏览
提问于 2025-04-15 15:49

我一直在寻找一个现有的Python库,类似于textile,用来格式化用户输入的文本。

如果只是我自己输入,使用textile就足够了,但因为这个输入是为了一个Django应用程序,它会接收用户的输入并显示出来,同时还要保持一些格式。

我发现现有的一些库有些小问题。有时候它们没有正确处理某些内容,允许我直接输入HTML,等等。

那么,有哪些推荐的转换引擎可以使用呢?

3 个回答

1

你有没有试过里面包含的 django.contrib.markup 库呢?

2

如果你在寻找一个文本处理的解决方案:django markup使用的PyTextile实际上有一个叫做textile_restricted()的函数,但不知道为什么这个函数没有被包含在django.contrib.markup里。你可以使用这个函数来提供受限的textile格式。你可以通过在你的模型中添加一个方法来调用textile_restricted,或者使用一个自定义的模板标签textile_restricted,这个标签可以用下面的代码来定义:

from django import template
from django.conf import settings
from django.utils.encoding import smart_str, force_unicode
from django.utils.safestring import mark_safe

register = template.Library()

def textile_restricted(value):
    try:
        import textile
    except ImportError:
        if settings.DEBUG:
            raise template.TemplateSyntaxError("Error in {% textile %} filter: The Python textile library isn't installed.")
        return force_unicode(value)
    else:
        return mark_safe(force_unicode(textile.textile_restricted(smart_str(value))))
textile_restricted.is_safe = True

register.filter(textile_restricted)
6

如果你在使用Django框架,可以试试安全的Markdown:

{% load markup %}

{{ foo|markdown:"safe" }}

你需要先安装Markdown,并在你的settings.py文件中的应用列表里加入django.contrib.markup

如果你想在保存时清理HTML内容,我用过feedparser的sanitize功能,效果不错(可以查看这个网站:http://www.feedparser.org/)。

import feedparser

body = feedparser._sanitizeHTML(body, 'utf8')

撰写回答