“安全”的Python HTML文本格式化(如textile)
我一直在寻找一个现有的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')